C# Linq查询问题:基于对象属性的区分

C# Linq查询问题:基于对象属性的区分,c#,linq,linq-to-entities,C#,Linq,Linq To Entities,我正在将多个列表聚合到一个列表中,并希望根据Foo Foo.Prop1的一个属性将其区分开来。。我没有权限修改Foo的相等比较器 Dictionary<string, List<Foo>> fooDictionary = new Dictionary<string, List<Foo>>(); List<Foo> foovals = (from e in fooDictionary where

我正在将多个列表聚合到一个列表中,并希望根据Foo Foo.Prop1的一个属性将其区分开来。。我没有权限修改Foo的相等比较器

Dictionary<string, List<Foo>> fooDictionary = new Dictionary<string, List<Foo>>();
List<Foo> foovals = (from e in fooDictionary
                     where e.Key == "foo1" || e.Key == "foo2" || e.Key == "foo3"
                     select e.Value).SelectMany(f => f).ToList();
这里唯一缺少的是最后的.Distinct,以使Foo的唯一性,但是,在我的例子中,我不能修改关于Foo的任何内容,因此简单地调用Distinct将不起作用


是否有方法修改此查询以返回基于Foo.Prop1的不同项?

您可以将自定义相等比较器传递给不同项:

在新文件FooEqualityComparer.cs中:

public class FooEqualityComparer : IEqualityComparer<Foo>
{
    public bool Equals(Foo x, Foo y)
    {
        return Equals(x.Prop1, y.Prop1);
    }

    public int GetHashCode(Foo x)
    {
        return x.Prop1.GetHashCode();
    }
}

您可以将自定义相等比较器传递给Distinct:

在新文件FooEqualityComparer.cs中:

public class FooEqualityComparer : IEqualityComparer<Foo>
{
    public bool Equals(Foo x, Foo y)
    {
        return Equals(x.Prop1, y.Prop1);
    }

    public int GetHashCode(Foo x)
    {
        return x.Prop1.GetHashCode();
    }
}
您可以在以下位置使用该方法:

您可以在以下位置使用该方法:


而且,我真的做不到。。这是在codesmith模板中,而Foo是由xml模式动态生成的,因此在代码模板中甚至不可访问。。至少我知道怎么做。你不需要访问类代码就可以编写一个相等比较器…我知道,因为Foo是一个自定义类,相等比较器需要知道它要比较什么属性,那么你怎么知道你想在它的基础上建立相等呢?@Sonic:我支持codekaizen。如果乔恩的答案对你有用,那么这个答案也适用。而且,我真的做不到。。这是在codesmith模板中,而Foo是由xml模式动态生成的,因此在代码模板中甚至不可访问。。至少我知道怎么做。你不需要访问类代码就可以编写一个相等比较器…我知道,因为Foo是一个自定义类,相等比较器需要知道它要比较什么属性,那么你怎么知道你想在它的基础上建立相等呢?@Sonic:我支持codekaizen。如果乔恩的答案对你有用,那么这一个也是。很好!虽然,这是一个CodeSmith模板的内部,所以我不确定是否可以添加语言扩展..很好!虽然,这是一个CodeSmith模板的内部,所以我不确定是否可以添加语言扩展..太“聪明”和不可读。还有哈奇:哪里有副作用,恶心。@Timwi:这只是一个概念的证明,和Distinct在幕后所做的差不多。用一个通用的扩展方法将它封装起来,这个扩展方法也接受一个键选择器函数,正如Jon在回答中提到的那样,您刚刚重新编写了DistinctBy。太“聪明”了,不可读。还有哈奇:哪里有副作用,恶心。@Timwi:这只是一个概念的证明,和Distinct在幕后所做的差不多。将它封装在一个通用扩展方法中,该方法也接受一个键选择器函数,您刚刚重新编写了DistinctBy,正如Jon在回答中提到的那样。
var tempKeys = new HashSet<int>();    // change int to the actual type of Prop1

List<Foo> foovals = (from e in fooDictionary
                     where e.Key == "foo1" || e.Key == "foo2" || e.Key == "foo3"
                     select e.Value).SelectMany(f => f)
                                    .Where(f => tempKeys.Add(f.Prop1))
                                    .ToList();
var query = fooVals.DistinctBy(foo => foo.Property1);