0
votes

Comment modifier les valeurs de quelques propriétés d'une liste à une autre à l'aide de Linq C #:

J'ai deux liste comme xxx pré>

je veux remplacer client.ordider = ordre.Id où order.customername = client.name code> p> p> Je veux remplacer Liste des clients Valeur de commande à partir de la liste de commande lorsque Customername correspond à Nom ProP CODE> P>

J'essayais quelque chose comme ça - P>

customer = order.Select(eo => new Customer { Name = eo.CustomerName });


0 commentaires

5 Réponses :


3
votes

LINQ convient principalement à la requête, pas à la modification des données.

à la place, je voudrais simplement utiliser un simple foreach : xxx

bien sûr Cette approche ne fonctionnera pas aussi bien lorsqu'il existe plusieurs commandes par client. Je conseillerais également de renommer les variables au pluriel - clients et commandes pour mieux dénoter leur signification.

pour une approche purement linq, vous pouvez écrire Un foreach méthode d'extension LINQ, mais je trouve un explicite une solution plus lisible.


0 commentaires

1
votes

Vous voulez effectuer une opération rejoindre (probablement une jointure intérieure). LINQ fournit une telle caractéristique xxx

mais @Martin Zikmund dit que je ferais prudent la manipulation des données directement.


0 commentaires

1
votes

Vous pouvez faire boucler des paires de commandes client et correspondante et mettre à jour les clients pour uniquement les paires correspondantes.

var matched = customers.Join(orders,
                             customer => customer.Name,
                             order => order.CustomerName,
                             (customer, order) => (Customer: customer, Order: order));

foreach (var pair in matched)
{
    pair.Customer.OrderId = pair.Order.Id;
}


0 commentaires

1
votes

Vous devez rejoindre les deux listes sur la propriété Nom code> à partir du client et de la propriété Nom d'utilisateur code> à partir de la commande, puis assignez OrderId code> à partir de la commande comme

List<Customer> result = new List<Customer>();

result = (from c in customer
          join o in order on c.Name equals o.CustomerName
          select new Customer
          {
              Id = c.Id,
              Name = c.Name,
              OrderId = o.Id
          }).ToList();

foreach (var item in result)
{
    Console.WriteLine($"Id: {item.Id}, \t Name: {item.Name}, \t OrderId: {item.OrderId}");
}

Console.ReadLine();


0 commentaires

2
votes

LINQ est principalement utilisé pour interrogé. Vous pouvez créer une nouvelle liste qui correspond à vos exigences.

Si vous le souhaitez, vous pouvez attribuer cette nouvelle liste à vos clients variables. P>

Vous souhaitez rejoindre vos clients et vos commandes sur le nom du client.

Solution simple: p> xxx pré>

hélas, cela ne fonctionnera pas si vous avez un client code> avec plusieurs commandes / Code>: P>

var result = customers.GroupJoin(orders, // GroupJoin the customers with orders
    customer => customer.Name,           // from every customer take the Name
    order => order.CustomerName,         // from every order take the CustomerName
    (customer, orders) => new            // for every customer with all his matching orders
    {                                    // make one new object
        Id = customer.Id,                  // take Id and Name from the matching Customer
        Name = customer.Name,

        // TODO Decide what to do if there are several orders for customer with this name
        // Keep all orders? Or keep the oldest one, the newest one?
        // the unpaid ones?
        AllOrders = orders.ToList(),
        OldestOrder = orders.Orderby(order => order.Date).FirstOrDefault(),
        NewestOrder = orders.OrderByDescending(order => order.Date).FirstOrDefault(),
        UnpaidOrders = orders.Where(order => order.Status == Status.Unpaid).ToList(),
    })
    .ToList();


0 commentaires