C# 基于对象属性查找和添加对象

C# 基于对象属性查找和添加对象,c#,C#,我有两张单子。一个填充了数据库表中的数据,另一个为空。我想根据名为ProductName的对象属性将orderList中的对象添加到VM.ViewOrders。如果VM.ViewOrder中的对象已包含ProductName,则不应将其添加到列表中。相反,将一个添加到属性numoprod 任何帮助都将不胜感激 我尝试使用foreachforeach,但您无法修改迭代列表。我试图复制VM.ViewOrderList,但它给了我一个“System.OutOfMemoryException”。 还尝试

我有两张单子。一个填充了数据库表中的数据,另一个为空。我想根据名为ProductName的对象属性将
orderList
中的对象添加到VM.ViewOrders。如果VM.ViewOrder中的对象已包含ProductName,则不应将其添加到列表中。相反,将一个添加到属性
numoprod

任何帮助都将不胜感激

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

List orderList=db.Orders.ToList();
vm.ViewOrders=新列表();
foreach(订单列表中的订单){
foreach(vm.ViewOrder中的订单1)){
if(order.ProductName.Equals(order.ProductName)){
order1.numoprod++;
} 
否则{
vm.ViewOrder.Add(订单);
order.numoprod=1;
}
}
}
System.OutOfMemoryException

收集被修改;枚举操作不能执行


我同意利亚姆的观点,为了提高效率,你应该使用字典

还有一件事,在您的语句中,您说如果条目重复,请从列表中删除条目,但您提供的代码表明您实际上是在尝试包含它们,但有一个计数。所以,也许是这样的:

        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];
        }

另外,原始订单列表包含重复的订单。最好以一种不会在一开始就创建重复项的方式来选择它们。例如,如果产品位于不同的表中,则可以使用。包括在查询中

我同意利亚姆的观点,为了提高效率,你应该使用字典

还有一件事,在您的语句中,您说如果条目重复,请从列表中删除条目,但您提供的代码表明您实际上是在尝试包含它们,但有一个计数。所以,也许是这样的:

        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];
        }
另外,原始订单列表包含重复的订单。最好以一种不会在一开始就创建重复项的方式来选择它们。例如,如果产品位于不同的表中,则可以使用。包括在查询中

使用Linq
GroupBy()

您可以稍后使用

foreach (IGrouping<string,Order> g in groups){
    var order  = gr.First();
    order.numOfProd = gr.Count();
    vm.ViewOrder.Add(order);
}
foreach(将g分组){
变量顺序=gr.First();
order.numoprod=gr.Count();
vm.ViewOrder.Add(订单);
}
使用Linq
GroupBy()

您可以稍后使用

foreach (IGrouping<string,Order> g in groups){
    var order  = gr.First();
    order.numOfProd = gr.Count();
    vm.ViewOrder.Add(order);
}
foreach(将g分组){
变量顺序=gr.First();
order.numoprod=gr.Count();
vm.ViewOrder.Add(订单);
}

您应该在这里使用
词典
而不是
db.Orders.ToList()的可能重复列表也是个坏主意。这会将整个订单表加载到内存中(我猜这就是为什么会出现内存不足的问题),而您只需要具有特定名称的订单表。这里有太多的问题需要解决。再多读几遍,再试一次,你在这几英里之外的地方,这就是所谓的“聚合”,数据库真的很擅长于此。查找
GroupBy
您应该在这里使用
词典
而不是
db.Orders.ToList()的列表可能重复也是个坏主意。这会将整个订单表加载到内存中(我猜这就是为什么会出现内存不足的问题),而您只需要具有特定名称的订单表。这里有太多的问题需要解决。再多读几遍,再试一次,你在这几英里之外的地方,这就是所谓的“聚合”,数据库真的很擅长于此。查找
GroupBy
Yes我想查看每个订单,计算一个产品的销售时间。这样我就可以计算出每一个已经售出的产品的总价值。是的,我想通过查看每个订单来计算一个产品售出的时间。这样,我就可以计算出每种已售出产品的总价值。