1. ホーム
  2. c#

[解決済み] 特定のプロパティに対するLINQのDistinct()

2022-03-19 03:24:54

質問

LINQについて勉強するために遊んでいるのですが、LINQを使用する方法がわかりません。 Distinct 単純なリストを持っていないとき(整数の単純なリストは非常に簡単ですが、これは問題ではありません)。私が使いたいもの 識別 のオブジェクトのリストに対して または もっと のプロパティを変更することはできますか?

例 もし、あるオブジェクトが Person で、プロパティ Id . どのようにすれば、すべてのパーソンと Distinct というプロパティで、それらに Id を使用するのですか?

Person1: Id=1, Name="Test1"
Person2: Id=1, Name="Test1"
Person3: Id=2, Name="Test2"

を取得するにはどうすればよいのでしょうか? Person1Person3 ? それは可能ですか?

LINQで不可能な場合、何がベストかというと、リストが Person .NET 3.5でそのプロパティのいくつかに応じて?

解決方法は?

EDIT : これは現在、以下の一部です。 MoreLINQ .

必要なのは、"distinct-by" を効果的に使用することです。かなり簡単に書けますが、現状ではLINQの一部とは思えません。

public static IEnumerable<TSource> DistinctBy<TSource, TKey>
    (this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
    HashSet<TKey> seenKeys = new HashSet<TKey>();
    foreach (TSource element in source)
    {
        if (seenKeys.Add(keySelector(element)))
        {
            yield return element;
        }
    }
}

つまり Id プロパティを使えばいい。

var query = people.DistinctBy(p => p.Id);

また、複数のプロパティを使用するには、適切に等式を実装した匿名型を使用します。

var query = people.DistinctBy(p => new { p.Id, p.Name });

未検証ですが、動作するはずです (少なくともコンパイルはできるようになりました)。

しかし、これはキーのデフォルトの比較器を想定しています。 HashSet のコンストラクタを使用します。