根据对象属性查找和添加对象

时间:2019-09-24 10:59:05

标签: c#

我有两个列表。一个填充来自数据库表的数据,另一个填充为空。我想基于名为ProductName的对象属性将orderList中的对象添加到VM.ViewOrders。如果VM.ViewOrder中的对象已经包含ProductName,则不应将其添加到列表中。而是将一个添加到属性numOfProd

任何帮助将不胜感激!

我尝试使用foreach,但是您无法修改迭代列表。我尝试制作VM.ViewOrderList的副本,但它给了我一个:“ System.OutOfMemoryException”。 还尝试将orderList的索引0添加到vm.ViewOrder,

List <Order> orderList = db.Orders.ToList();
vm.ViewOrders = new List<Order>();

foreach(Order order in orderList) {
  foreach(Order order1 in vm.ViewOrder)) {
    if (order.ProductName.Equals(order1.ProductName)) {
      order1.numOfProd++;
    } 
    else {
      vm.ViewOrder.Add(order);
      order.numOfProd = 1;
    }
  }
}
  

System.OutOfMemoryException

     

集合已修改;枚举操作可能无法执行。

2 个答案:

答案 0 :(得分:2)

使用Linq GroupBy()

var groups = from order in orderList 
    group order by order.ProductName

您以后可以使用

foreach (IGrouping<string,Order> g in groups){
    var order  = gr.First();
    order.numOfProd = gr.Count();
    vm.ViewOrder.Add(order);
}

答案 1 :(得分:0)

我同意利亚姆的观点,您应该使用字典来提高效率。

另一件事,在您的语句中,您说如果它们是重复项,则从列表中省略这些条目,但是您提供的代码表明您实际上是在试图将它们包括在内但要计数。因此,也许是这样的:

        Dictionary<Order, int> dictionary = new Dictionary<IEntity, int>();
        foreach (Order order in ordersList) {
            if (dictionary.ContainsKey(order)) {
                dictionary[order] = dictionary[order] + 1;
            }
        }
        vm.ViewOrders = dictionary.Keys.ToList();
        foreach (Order order in vm.ViewOrders) {
            order.NumberOfProducts = dictionary[order];
        }

如果您确实想省略重复的内容,那么可以使用类似以下内容的东西代替

        vm.ViewOrders = dictionary.Keys.Where( obj => dictionary[obj] == 1).ToList();
        foreach (Order order in ordersList) {
            order.NumberOfProducts = dictionary[order];
        }

另一件事,原始订单列表包含重复项。最好以一开始就不创建重复项的方式来选择它们。例如,如果产品在其他表中,则可以在查询中使用.Include。