1

私はあなたが助けてくれるかどうか疑問に思っていました。

情報のリストがあります。

クライアント番号 シーケンス番号

これには、次のようなデータが含まれる場合があります。

Cli No: 0000001、seq: 1
Cli No: 0000001、seq: 2
Cli No: 0000001、seq: 3 Cli
No: 0000001、seq: 3
Cli No: 0000002、seq: 1
Cli No: 0000002、seq: 1 Cli
No : 0000002、シーケンス: 2
Cli 番号: 0000002、シーケンス: 2

最大シーケンス番号のリストを生成したいと考えています。

上記の例のように、シーケンス番号は何度も繰り返される場合があることに注意してください。

したがって、例から得たいリストは次のようになります。

Cli 番号: 0000001、seq: 3 Cli
番号: 0000001、seq: 3
Cli 番号: 0000002、seq: 2
Cli 番号: 0000002、seq: 2

私が試してみました;

  var x = criticalNotesData.OrderBy(y => y.ClientNo)
         .ThenBy(z => z.SequenceNo).ToList();
  var m = x.Max(r => r.SequenceNo).ToList();

ただし、最大値は、クライアントごとではなく、リストに最大シーケンス番号を提供しているだけです。

ありがとう、

デビッド

4

6 に答える 6

3

この方法では、新しいオブジェクトを作成する必要はなく、重複した最大アイテムを取得するGroupBy 必要OrderByDescendingありませんFirstMax

var result = criticalNotesData.GroupBy(x => x.ClientNo)
                              .SelectMany(g => g.GroupBy(y => y.SequenceNo)
                                                .OrderByDescending(gg => gg.Key)
                                                .First()
                                           );

結果はまさにあなたが望むものになります:

Cli No: 0000001, seq: 3 
Cli No: 0000001, seq: 3 
Cli No: 0000002, seq: 2 
Cli No: 0000002, seq: 2 
于 2012-09-13T10:59:04.477 に答える
1

GroupByが必要です

var maxItems = criticalNotesData.GroupBy(p => p.ClientNo)
                                .Select(r => r.Max(q => q.SeqNo));

このようなもの。
また

var maxItemsClientWise = from p in criticalNotesData
                           group p by p.ClientNo into r
                           select new { MaxSeq = r.Max(g => g.SeqNo), 
                                        Client = r.First().ClientNo };
于 2012-09-13T10:32:11.870 に答える
1

試すことはできませんが、これでうまくいくと思います。

var m = x.GroupBy(r => r.ClientNo).Select(g => g.Max(x => x.SequenceNo));

編集:クライアントを知るために:

var m = x.GroupBy(r => r.ClientNo).Select(g => new { ClientID = g.Key, Max = g.Max(x => x.SequenceNo) });
于 2012-09-13T10:32:34.967 に答える
1

次のクエリを使用して、基準に基づいてクラス オブジェクトのリストを取得できます。

var query = (from t in list
            group t by t.CliNo into tgroup
            select new ClientSequence
            {
                CliNo = tgroup.Key,
                seq = tgroup.Max(r => r.seq)

            }).ToList();

クラス構造が次のようになっていると想定しています。

class ClientSequence
{
    public string CliNo { get; set; }
    public int seq { get; set; }
}

あなたのリストは次のとおりです。

List<ClientSequence> list = new List<ClientSequence>
       {
           new ClientSequence{ CliNo= "0000001", seq= 1},
           new ClientSequence{ CliNo= "0000001", seq= 2},
           new ClientSequence{ CliNo= "0000001", seq= 3},
           new ClientSequence{ CliNo= "0000002", seq= 1},
           new ClientSequence{ CliNo= "0000002", seq= 1},
           new ClientSequence{ CliNo= "0000002", seq= 1},
           new ClientSequence{ CliNo= "0000002", seq= 2},
           new ClientSequence{ CliNo= "0000002", seq= 2},
   };

出力:

foreach (ClientSequence cs in query)
{
    Console.Write("Client No.: " + cs.CliNo);
    Console.WriteLine(" Max Sequence No.: " + cs.seq);
}

印刷します

Client No.: 0000001 Max Sequence No.: 3
Client No.: 0000002 Max Sequence No.: 2
于 2012-09-13T10:41:44.540 に答える
0

このようなデータを想定すると:

var list = new []
{
    new { CliNo= "0000001", SeqNo= 1 },
    new { CliNo= "0000001", SeqNo= 2 },
    new { CliNo= "0000002", SeqNo= 1 },     
    new { CliNo= "0000001", SeqNo= 3 },
    new { CliNo= "0000001", SeqNo= 3 },
    new { CliNo= "0000002", SeqNo= 1 },
    new { CliNo= "0000002", SeqNo= 1 },
    new { CliNo= "0000002", SeqNo= 2 },
    new { CliNo= "0000002", SeqNo= 2 },
};

あなたはこれを使うことができます:

var output = 
    from i in list
    orderby i.CliNo, i.SeqNo
    group i by i.CliNo into g
    let max = g.Max(x => x.SeqNo)
    from r in g where r.SeqNo == max
    select r;

コメントで言ったことはまだ有効です。データの最初の順序は重要です。このコードでは一般的なアプローチを採用しましたが、最初の順序について保証がある場合は、データは高価です。

于 2012-09-13T22:04:02.413 に答える
0

「クライアント」エントリごとに、最高のシーケンスを知りたいとします。したがって、結果は、Max によって返される単一の値ではなく、(クライアントごとの) シーケンスでなければならないことを意味します。どうですか:

var maxSequence = criticalNotesData
      .GroupBy(n => n.ClientNo)
      .Select(g => new { Client = g.Key, Max = g.Max(i => i.SequenceNo) } );

foreach ( var entry in maxSequence )
{
    Console.WriteLine("Client {0} has max sequence of {1}", 
                      entry.Client, entry.Max); 
}

// Looking at your original, you now want only to know the (from the original)
// the entries matching MAX.  Since you now know the max per client, a second
// operation is needed.
var maxValueEntries = criticalNotesData
        .Where(n => maxSequence
                      .Single(c => c.Client == n.Client)
                      .Max == n.SequenceNo));

maxValueEntries多くのルックアップを行っているため、値の辞書の方が優れている可能性があります。

// Turning the original into a Dictionary of clientNo returning the 
// max sequence.
var maxSequence2 = criticalNotesData
      .GroupBy(n => n.ClientNo)
      .Select(g => new { Client = g.Key, Max = g.Max(i => i.SequenceNo) } )
      .ToDictionary(c => c.Client, c => c.Max);
var maxValueEntries2 = criticalNotesData
        .Where(n => maxSequence2[n.Client] == n.SequenceNo));
于 2012-09-13T10:34:14.270 に答える