3

オブジェクト自体ではなく、オブジェクトのプロパティを比較する Union の実装が必要でした。私は次のことを思いつきました:

public static IEnumerable<TSource> UnionBy<TSource, TKey>(
    this IEnumerable<TSource> first,
    IEnumerable<TSource> second,
    Func<TSource, TKey> keySelector,
    IEqualityComparer<TKey> keyComparer = null)
{
    HashSet<TKey> keys = new HashSet<TKey>(keyComparer);
    foreach (TSource element in first)
    {
        if (keys.Add(keySelector(element)))
        {
            yield return element;
        }
    }
    foreach (TSource element in second)
    {
        if (!keys.Add(keySelector(element)))
        {
            continue;
        }
        yield return element;
    }
}

次の行に沿って何かを言うことで使用できます。

result = first.UnionBy(second, x => x.Property1);

これは私にとってはうまくいきますが、Linqにまだ実装されていないものがないかどうか疑問に思っていました(私には直感的ではないように思われる独自のEqualityComparerを実装する以外に)。

このユニオンが必要になるたびに同じプロパティを使用するわけではないので、私にEqualityComparerは正しくないように見える状況ごとに複数の を作成するかEqualityComparer、プロパティセレクタ Func を受け取るジェネリックを作成する必要があります。プロパティ セレクター自体を受け入れる一般的な Linq 拡張機能を提供するよりも、直感的ではないように思えました。

4

1 に答える 1

4

はい、代わりに次のように記述できます。

var q = first.Concat(second).GroupBy(x => x.Property1).Select(x => x.First());
于 2013-05-10T13:31:26.860 に答える