Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#列表分组和赋值_C#_Linq - Fatal编程技术网

C#列表分组和赋值

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

我有一份订单单。此列表包含同一项目的多个订单,请参见下表

然后,我想为每个相同(即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
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;
}