我有以下数据结构:列表myOrders
所以它是一个基于今天收到的订单的数据列表(如下所示)(所以如果不同的人多次购买相同的商品,您可以复制)。
Data
{
string itemName
double itemQuantiy
string partName
double partQuantity
}
作为一个示例,列表在填充时看起来像这样:
itemName itemQuantity partName partQuantity
A 1 alpha 5
A 1 beta 2
A 1 delta 100
B 1 alpha 17
B 1 gamma 2000
A 2 alpha 10
A 2 beta 4
A 2 delta 200
从上面的表格中可以看到,物品A有3个部分(alpha, beta, delta),物品B有两个部分(alpha, gamma),它们都有各自的数量,在这个例子中,物品A被订购了两次(前3行是第一次订购1单位的A,后3行订购2单位的A)。
我需要把它呈现给用户,但它应该按项目分组,数量应该汇总。
最终结果(在屏幕上显示给用户)应该是这样的:
itemName itemQuantity partName partQuantity
A 3 alpha 15
beta 6
delta 300
B 1 alpha 17
gamma 2000
这可以用LINQ或WPF之类的东西来完成吗?(或者你建议的任何其他方式——我现在不知所措)。
Linq方式如下。
List<Data> myOrders = GetList();
IEnumerable<Data> groupingQuery = myOrders
.GroupBy(data => new { data.itemName, data.partName } )
.Select(g => new Data()
{
itemName = g.Key.itemName,
partName = g.Key.partName,
itemQuantity = g.Sum(x => x.itemQuantity),
partQuantity = g.Sum(x => x.partQuantity)
})
.OrderBy(data => data.itemName)
.ThenBy(data => data.partName);
或者您可以将数据转换为项和部分…
List<Item> items = (
from data in myOrders
group data by data.itemName into itemGroup
let partGroups = itemGroup.GroupBy(x => x.partName)
select new Item()
{
itemName = itemGroup.Key,
itemQuantity = partGroups.Min(partGroup => partGroup.Sum(x => x.itemQuantity)),
Parts = (
from partGroup in partgroups
select new Part() { partName = partGroup.Key, partQuantity = partGroup.Sum(x => x.partQuantity) }
).ToList();
}).ToList();
这里有一些可能不一致的数据,这使得分组更加困难。
itemName itemQuantity partName partQuantity
A 1 alpha 5
A 2 beta 2
A 1 delta 100
我有1个A还是2个A ?
您可以使用LINQ GroupBy方法(http://msdn.microsoft.com/ru-ru/library/system.linq.enumerable.groupby.aspx)
像这样:
List<Data> data = ...;
var groupedItems = data.GroupBy(d => d.itemName);
对于WPF,您可以使用分组功能(ItemsControl)。GroupStyle等,例如datagrid: http://wpftutorial.net/DataGrid.html#grouping(你可以谷歌找到更多的教程)