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の構築があると感じますが、私は何も思い付くことができませんでした。
Notes.Select(x => x.Author).Distinct();
これはAuthor
値のシーケンス(IEnumerable<string>
) - ユニークな値ごとに1つを返します。
作者によるNoteクラスの区別
var DistinctItems = Note.GroupBy(x => x.Author).Select(y => y.First());
foreach(var item in DistinctItems)
{
//Add to other List
}
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();
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
を得ることができます。