是否可以使用linq组合这两个语句?

时间:2013-05-18 13:05:33

标签: asp.net linq

使用Asp.Net 4.0 / C#

我有一个项目列表。该列表包含重复项。

这是项目类:

public class PingtreeNode
{
    public int TierId { get; set; }
    public int LenderId { get; set; }
    public int Weight { get; set; }
    public int Seq { get; set; }

    public PingtreeNode(int tierId, int lenderId, int weight, int seq)
    {

        TierId = tierId;
        LenderId = lenderId;
        Weight = weight;
        Seq = seq;
    }
}

在第一个实例中,我想为每个LenderId选择第一个项目。我这样使用这个linq:

var tierNodes = new List<PingtreeNode>();    
tierNodes = tierNodes.GroupBy(x => x.LenderId).Select(x => x.First()).ToList();

但是,我还想在列表中添加一个序列,从1,2,3等开始。我目前通过这样循环来单独执行此操作:

            int seq = 1;
            foreach (var t in tierNodes)
            {
                t.Seq = seq;
                seq++;
            }

使用单个linq语句可以同时对组和序列进行分组吗?

2 个答案:

答案 0 :(得分:3)

int seq = 1;
var tierNodes = new List<PingtreeNode>();    
tierNodes = tierNodes
    .GroupBy(x => x.LenderId)
    .Select(x => { var y = x.First(); y.Seq = seq++; return y; })
    .ToList();

答案 1 :(得分:1)

可枚举的某些方法在选择器函数上有一个索引参数。其中一个是Select

您可以将该索引参数用于序列号:

var tierNodes = new List<PingtreeNode>();    
tierNodes = tierNodes
    .GroupBy(x => x.LenderId)
    .Select((x, i) => { var y = x.First(); y.Seq = i + 1; return y; })
    .ToList();

这将为您提供一个可枚举的独立任何外部变量,因此是幂等的,没有任何闭包。