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

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

我试图使用Linq Distinct(),但我不想使用相等比较器。 有另一种方法吗?

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

我正在尝试类似于:

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

这是在ddl显示重复的公司。

谢谢!

以下expression式将只select不同的公司,并返回第一个与其ID相同的事件。

 partnerService.SelectPartners().GroupBy(p => p.Name).Select(g => g.First()); 
 var distinctCompanies = Companies .GroupBy(c => c.CompanyName) .Select(g => g.First()); 

整个select不同的作品。 如果在select中包含c.codPartner,并且对同一个c.name有两个不同的c.codPartner值,那么您将看到具有相同c.name的两行。

我不认为你可以做一个匿名类,但如果你创build一个数据对象

  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; } } } 

你可以像创build一个比较对象

  class FooComparer : IEqualityComparer<Foo> { public bool Equals(Foo x, Foo y) { return x.Name == y.Name; } public int GetHashCode(Foo obj) { return obj.GetHashCode(); } } 

如果不指定IEqualityComparer参数,则只会使用Object.ReferenceEquals,它将查看对象GetHashKey值。 对于匿名types,它们是唯一的。

现在解决这个问题有点棘手,因为你不能为匿名types写一个IEqualityComparer。 所以你可以为这个问题创build一个真正的types:

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

如果你不告诉它(通过IEqualityComparer)使用另一种方法,Distinc将使用GetHashCode。 你可以使用通用的equalitycomparer,像这样:

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

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

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