217

C# で、Note3 つの文字列メンバー変数で呼び出されるクラスがあるとします。

public class Note
{
    public string Title;
    public string Author;
    public string Text;
}

そして、私はタイプのリストを持っていますNote:

List<Note> Notes = new List<Note>();

Author 列のすべての個別の値のリストを取得する最もクリーンな方法は何ですか?

リストを反復処理して、重複していないすべての値を別の文字列リストに追加することもできますが、これは汚くて非効率的です。これを 1 行で行う魔法のような Linq 構造があるような気がしますが、何も思いつきませんでした。

4

5 に答える 5

405
Notes.Select(x => x.Author).Distinct();

これにより、値のシーケンス ( IEnumerable<string>)が返されAuthorます。一意の値ごとに 1 つです。

于 2012-04-21T00:33:46.153 に答える
117

作成者ごとに Note クラスを区別する

var DistinctItems = Notes.GroupBy(x => x.Author).Select(y => y.First());

foreach(var item in DistinctItems)
{
    //Add to other List
}
于 2014-06-23T07:01:11.657 に答える
37

Jon Skeet は、演算子を持つmorelinqというライブラリを作成しましたDistinctBy()。実装についてはこちらをご覧ください。あなたのコードは次のようになります

IEnumerable<Note> distinctNotes = Notes.DistinctBy(note => note.Author);

更新: 質問を読み直した後、特定の著者のセットを探しているだけなら、Kirk が正しい答えを持っています。

DistinctBy のサンプル、いくつかのフィールドを追加しました。

res = res.DistinctBy(i => i.Name).DistinctBy(i => i.ProductId).ToList();
于 2012-04-21T00:37:38.790 に答える
-3
mcilist = (from mci in mcilist select mci).Distinct().ToList();
于 2013-10-09T21:26:15.310 に答える