web-dev-qa-db-ja.com

Listで個別の値の一覧を取得する

C#で、Noteという3つのStringメンバー変数を持つクラスがあるとします。

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

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

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

Author列のすべての異なる値のリストを取得するための最も明確な方法は何ですか?

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

145
Darrel Hoffman
Notes.Select(x => x.Author).Distinct();

これはAuthor値のシーケンス(IEnumerable<string>) - ユニークな値ごとに1つを返します。

283
Kirk Woll

作者によるNoteクラスの区別

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

foreach(var item in DistinctItems)
{
    //Add to other List
}
66
atik sarker

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

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

更新:質問をもう一度読んだ後で、Kirkが正当な答えを出しているのは、まったく異なる一連の著者を探している場合です。

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

res = res.DistinctBy(i => i.Name).DistinctBy(i => i.ProductId).ToList();
28
Dan Busha
public class KeyNote
{
    public long KeyNoteId { get; set; }
    public long CourseId { get; set; }
    public string CourseName { get; set; }
    public string Note { get; set; }
    public DateTime CreatedDate { get; set; }
}

public List<KeyNote> KeyNotes { get; set; }
public List<RefCourse> GetCourses { get; set; }    

List<RefCourse> courses = KeyNotes.Select(x => new RefCourse { CourseId = x.CourseId, Name = x.CourseName }).Distinct().ToList();

上記のロジックを使うことで、一意のCourseを得ることができます。

1
Bhaskar