我有两个列表。一个填充来自数据库表的数据,另一个填充为空。我想基于名为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
集合已修改;枚举操作可能无法执行。
答案 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。