C#列表分组和赋值
我有一份订单单。此列表包含同一项目的多个订单,请参见下表 然后,我想为每个相同(即ABC)的项目分配相同的块ID。因此,ABC的块ID为1,每个GHJ的块ID为2,等等。这样做的最佳方式是什么 目前,我按订单ID对列表进行排序,然后进行for循环,并检查当前订单ID是否等于下一个订单ID,如果是,则将这两个订单ID指定为相同的块ID。是否有更好的方法使用linq或任何其他方法进行此操作C#列表分组和赋值,c#,linq,C#,Linq,我有一份订单单。此列表包含同一项目的多个订单,请参见下表 然后,我想为每个相同(即ABC)的项目分配相同的块ID。因此,ABC的块ID为1,每个GHJ的块ID为2,等等。这样做的最佳方式是什么 目前,我按订单ID对列表进行排序,然后进行for循环,并检查当前订单ID是否等于下一个订单ID,如果是,则将这两个订单ID指定为相同的块ID。是否有更好的方法使用linq或任何其他方法进行此操作 Order ID Block ID ABC ABC ABC GHJ GHJ GHJ
Order ID Block ID
ABC
ABC
ABC
GHJ
GHJ
GHJ
MNO
MNO
您可以这样做,它将为相同的orderid分配相同的blockid
var ordered = listOrder.GroupBy(x => x.OrderId).ToList();
for (int i = 0; i < ordered.Count(); i++)
{
ordered[i].ForEach(x=>x.BlockId=i+1);
}
var ordered=listOrder.GroupBy(x=>x.OrderId.ToList();
对于(int i=0;ix.BlockId=i+1);
}
它将按orderid对订单进行分组,然后为每个组分配下一个blockid。请注意,在linq中不能完全执行此操作,因为linq用于查询不更改数据。始终取决于在此上下文中对您来说什么更好
对于这个微不足道的问题,有很多可能的解决方案。在我的脑海里,我能想到:
var blockId = 1;
foreach(var grp in yourOrders.GroupBy(o => o.OrderId))
{
foreach(var order in grp)
{
order.BlockId = blockId;
}
blockId++;
}
或者(更“灵巧”):
或者(您仍然可以遵循代码吗?)
或者(可能最接近于简单的for
循环):
林克?是的。比简单的循环好?嗯
使用Linq不会神奇地使代码变得更好。当然,它通常可以使它更具声明性/可读性/更快(就惰性计算而言),但如果您仅仅因为Linq而试图强制使用Linq,那么您肯定可以使原本很好的命令式循环变得不可读
作为旁注:
如果您想获得有关工作代码的反馈,请访问向我们展示您的代码。@okrumnow,不是每个问题都需要一些任意代码块。向这个问题添加代码并不能改善它一点。这是一个非常清楚且格式良好的问题,请参见@Liam,因为OP提到了他拥有的一些代码,这表明这将有助于我们如何定义数据结构,因此我们可以提供一个定制的答案。嗨,Wudzik,我尝试了你的解决方案,但无法完全实现。我必须将for循环代码更改为var grp=ordered[I].ToList();grp.ForEach(ord=>ord.BlockId=I;否则ForEach扩展方法不会出现
foreach(var t in yourOrders.GroupBy(o => o.OrderId).Zip(Enumerable.Range(1, Int32.MaxValue), (grp, bid) => new {grp, bid}))
{
foreach(var order in t.grp)
{
order.BlockId = t.bid;
}
}
var orders = yourOrders.GroupBy(o => o.OrderId)
.Zip(Enumerable.Range(1, Int16.MaxValue), (grp, id) => new {orders = grp, id})
.SelectMany(grp => grp.orders, (grp, order) => new {order, grp.id});
foreach(var item in orders)
{
item.order.BlockId = item.id;
}
Order prev = null;
blockId = 1;
foreach (var order in yourOrders.OrderBy(o => o.OrderId))
{
order.BlockId = (prev == null || prev.OrderId == order.OrderId) ?
blockId :
++blockId;
prev = order;
}