如何获取组中项目的索引

时间:2013-06-01 23:20:00

标签: c# linq

下面的代码给出了一个超出范围异常的参数。我试图用ElementAt()exension方法获取当前索引的某些项目。我在这里缺少什么:

var orders = cart.GroupBy(x => x.ClientForOrdersId).Select
            ((x, i) =>
             new Client_InvoiceBalance()
                 {
                     IsMainClient = x.Key == x.ElementAt(i).MainClientId ? true : false,
                     MainClientId = x.ElementAt(i).MainClientId,
                     OtherClientId = x.ElementAt(i).ClientForOrdersId,
                     InvoiceOrderNumber = orderNumber,
                     IsPaidInFull = false
                 }).ToList();

1 个答案:

答案 0 :(得分:7)

GroupBy(...).Select((x,i)=>中的索引是所有组中组的索引,而不是组中项目的索引。

考虑购物车中有50件商品,GroupBy根据ClientForOrdersId创建10个不同的商品。然后索引从0开始,以9结束。所以你不能在ElementAt中使用它,因为每个组的大小只有5,你得到ArgumentOutOfRangeException

我假设您要创建List<Client_IncvoiceBalance>作为结果。除了ElementAt之外,您完全不需要SelectMany

List<Client_IncvoiceBalance> balances = cart
    .GroupBy(x => x.ClientForOrdersId)
    .SelectMany((g, iGroup) => // iGroup is the index of the group
        g.Select((x, iItem) => // iItem is the index of each item in the group
             new Client_InvoiceBalance()
             {
                 IsMainClient = g.Key == x.MainClientId,
                 MainClientId = x.MainClientId,
                 OtherClientId = x.ClientForOrdersId,
                 InvoiceOrderNumber = orderNumber,
                 IsPaidInFull = false
             }
        )).ToList();