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为每一种对我来说似乎不正确的情况制作多个 's,要么制作一些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 回答