33

我正在尝试用拜耳、Medley 等制药公司填充下拉列表。而且,我从 DB 中获取这些名称,并且这些名称在 DB 中重复,但具有不同的 id。

我正在尝试使用 Linq Distinct(),但我不想使用相等比较器。还有其他方法吗?

我的下拉列表必须填写公司的 ID 和名称。

我正在尝试类似的东西:

var x = _partnerService
           .SelectPartners()
           .Select(c => new {codPartner = c.codPartner, name = c.name})
           .Distinct();

这显示了 ddl 中的重复公司。

谢谢!

4

7 回答 7

76

以下表达式将仅选择不同的公司并返回第一次出现的公司及其 id。

partnerService.SelectPartners().GroupBy(p => p.Name).Select(g => g.First());
于 2009-05-26T19:29:11.983 回答
16
var distinctCompanies = Companies
  .GroupBy(c => c.CompanyName)
  .Select(g => g.First());
于 2009-05-26T19:24:29.123 回答
3

Distinct 适用于整个选择。如果您在选择中包含 c.codPartner,并且对于相同的 c.name 有两个不同的 c.codPartner 值,那么您将看到具有相同 c.name 的两行。

于 2009-05-26T19:13:17.337 回答
2

我不认为你可以用匿名类来做到这一点,但如果你创建了一个像这样的数据对象

    class Foo
{
    private int _ID;

    public int ID
    {
        get { return _ID; }
        set { _ID = value; }
    }
    private string _Name;

    public string Name
    {
        get { return _Name; }
        set { _Name = value; }
    }

}

您可以创建一个比较器对象,例如

    class FooComparer : IEqualityComparer<Foo>
{


    public bool Equals(Foo x, Foo y)
    {
        return x.Name == y.Name;
    }

    public int GetHashCode(Foo obj)
    {
        return obj.GetHashCode();
    }

}
于 2009-05-26T19:19:24.877 回答
1

如果您没有指定 IEqualityComparer 参数,那么它将只使用 Object.ReferenceEquals,它查看对象的 GetHashKey 值。对于匿名类型,它们是唯一的。

现在解决这个问题有点棘手,因为您不能为匿名类型编写 IEqualityComparer。所以你必须为这个问题创建一个真实的类型:

class Partner
{
    public int codPartner {get; set;}
    public string name {get; set;}
    public override int GetHashCode() { return name .GetHashCode();}
}

var x = _partnerService.SelectPartners()
        .Select(c => new Partner {codPartner = c.codPartner, name = c.name})
        .Distinct();
于 2009-05-26T19:17:30.417 回答
1

如果您不告诉 Distinc(通过 IEqualityComparer)使用另一种方法,则 Distinc 将使用 GetHashCode。您可以使用通用的相等比较器,如下所示:

public class GenericEqualityComparer<T> : IEqualityComparer<T>
{    
    private Func<T, T, Boolean> comparer;    

    public GenericEqualityComparer(Func<T, T, Boolean> comparer)    
    {        
        this.comparer = comparer;    
    }    

    #region IEqualityComparer<T> Implementation

    public bool Equals(T x, T y)    
    {        
        return comparer(x, y);    
    }    

    public int GetHashCode(T obj)    
    {
        return obj.GetHashCode();  
    }    

    #endregion
}

然后像这样使用(种类)

public static IEqualityComparer<YourType> MyComparer
{
   get
     {
      return new GenericEqualityComparer<YourType>((x, y) =>
       {
          return x.name.Equals(y.name);
        });
      }
}
于 2009-05-26T19:28:18.867 回答
0

只需使用其他重载之一将您自己的比较器传递给 Distinct 方法。

(extension) IQueryable<T> IQueryable<T>.Distinct( IEqualityComparer<T> comparer )
于 2009-05-26T19:15:25.117 回答