0

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 ステートメントを使用して、同時にグループ化とシーケンスの両方を行うことは可能ですか?

4

2 に答える 2

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();
于 2013-05-18T13:15:58.287 に答える
1

enumerable の一部のメソッドには、セレクター関数にインデックス パラメーターがあります。それらの 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();

これにより、外部変数から独立した列挙可能な値が得られるため、べき等であり、クロージャーはありません。

于 2013-05-19T21:45:37.357 に答える