列表<;T>;。C#中的Distinct()-等式比较的多个条件?

列表<;T>;。C#中的Distinct()-等式比较的多个条件?,c#,list,distinct,C#,List,Distinct,我有一个对象集合,每个对象都有几个属性。我经常需要获取此集合中许多属性的不同值的列表。如果我在这种类型上实现IEqualityComparer,它将为我提供一个获取集合中不同对象的标准。如何才能在此集合的多个条件上调用Distinct 比如说, class Product { string name ; string code ; string supplier ; //etc } 想象一下这样一个产品对象列表。 有时,我想在列表中列出不同的名称,有时还想列出不同

我有一个对象集合,每个对象都有几个属性。我经常需要获取此集合中许多属性的不同值的列表。如果我在这种类型上实现IEqualityComparer,它将为我提供一个获取集合中不同对象的标准。如何才能在此集合的多个条件上调用Distinct

比如说,

  class Product {
    string name ;
    string code ;
    string supplier ;
//etc 
}
想象一下这样一个产品对象列表。 有时,我想在列表中列出不同的名称,有时还想列出不同的供应商。等
如果我根据IEqualityComparer的实现方式在这些产品的列表上调用Distinct,它将始终使用相同的标准,这不符合我的目的。

您可以使用接受IEqualityComparer参数的。

只需为对
Distinct
的不同调用提供不同的
IEqualityComparer
实现即可。请注意
IEqualityComparer
IEqualityComparer
之间的区别-通常类型不应为其自身实现
IEqualityComparer
(因此
Product
不会实现
IEqualityComparer
)。您将有不同的实现,如ProductNameComparer、ProductCodeComparer等

然而,另一种选择是在


您还可以创建一个比较器,该比较器接受Equals和GetHashCode方法的函数参数。差不多

class Foo
{
    public string Name { get; set; }
    public int Id { get; set; }
}    

class FooComparer : IEqualityComparer<Foo>
{
    public FooComparer(Func<Foo, Foo, bool> equalityComparer, Func<Foo, int> getHashCode)
    {
        EqualityComparer = equalityComparer;
        HashCodeGenerator = getHashCode;
    }

    Func<Foo, Foo, bool> EqualityComparer;
    Func<Foo, int> HashCodeGenerator;

    public bool Equals(Foo x, Foo y)
    {
        return EqualityComparer(x, y);
    }

    public int GetHashCode(Foo obj)
    {
        return HashCodeGenerator(obj);
    }
}
class-Foo
{
公共字符串名称{get;set;}
公共int Id{get;set;}
}    
类FooComparer:IEqualityComparer
{
公共FooComparer(Func equalityComparer,Func getHashCode)
{
EqualityComparer=EqualityComparer;
HashCodeGenerator=getHashCode;
}
函数均衡比较;
Func哈希代码生成器;
公共布尔等于(Foo x,Foo y)
{
返回等式比较器(x,y);
}
公共int GetHashCode(Foo obj)
{
返回HashCodeGenerator(obj);
}
}

listfoos=newlist(){newfoo(){Name=“A”,Id=4},newfoo(){Name=“B”,Id=4};
var list1=foos.Distinct(新的FooComparer((x,y)=>x.Id==y.Id,f=>f.Id.GetHashCode());

如果没有Hans提前2分钟的回复,本应选择作为答案。
class Foo
{
    public string Name { get; set; }
    public int Id { get; set; }
}    

class FooComparer : IEqualityComparer<Foo>
{
    public FooComparer(Func<Foo, Foo, bool> equalityComparer, Func<Foo, int> getHashCode)
    {
        EqualityComparer = equalityComparer;
        HashCodeGenerator = getHashCode;
    }

    Func<Foo, Foo, bool> EqualityComparer;
    Func<Foo, int> HashCodeGenerator;

    public bool Equals(Foo x, Foo y)
    {
        return EqualityComparer(x, y);
    }

    public int GetHashCode(Foo obj)
    {
        return HashCodeGenerator(obj);
    }
}
List<Foo> foos = new List<Foo>() { new Foo() { Name = "A", Id = 4 }, new Foo() { Name = "B", Id = 4 } };
var list1 = foos.Distinct(new FooComparer((x, y) => x.Id == y.Id, f => f.Id.GetHashCode()));