Linq Distinct()按名称填充带有名称和值的下拉列表

时间:2009-05-26 19:08:51

标签: c# linq-to-sql distinct

我正在尝试使用制药公司填写下拉列表,例如Bayer,Medley等。而且,我从DB获取这些名称,这些名称在DB中重复,但具有不同的ID。

我正在尝试使用Linq Distinct(),但我不想使用相等比较器。还有另一种方式吗?

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

我正在尝试这样的事情:

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

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

谢谢!

7 个答案:

答案 0 :(得分:76)

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

partnerService.SelectPartners().GroupBy(p => p.Name).Select(g => g.First());

答案 1 :(得分:17)

var distinctCompanies = Companies
  .GroupBy(c => c.CompanyName)
  .Select(g => g.First());

答案 2 :(得分:3)

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

答案 3 :(得分: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();
    }

}

答案 4 :(得分:1)

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

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

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();

答案 5 :(得分:1)

如果您没有告诉它(通过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
}

然后像这样使用(kindof)

public static IEqualityComparer<YourType> MyComparer
{
   get
     {
      return new GenericEqualityComparer<YourType>((x, y) =>
       {
          return x.name.Equals(y.name);
        });
      }
}

答案 6 :(得分:0)

使用其他一个重载将你自己的比较器传递给Distinct方法。

(extension) IQueryable<T> IQueryable<T>.Distinct( IEqualityComparer<T> comparer )