我正在尝试使用制药公司填写下拉列表,例如Bayer,Medley等。而且,我从DB获取这些名称,这些名称在DB中重复,但具有不同的ID。
我正在尝试使用Linq Distinct(),但我不想使用相等比较器。还有另一种方式吗?
我的下拉列表必须填写公司的ID和名称。
我正在尝试这样的事情:
var x = _partnerService
.SelectPartners()
.Select(c => new {codPartner = c.codPartner, name = c.name})
.Distinct();
这显示了ddl中的重复公司。
谢谢!
答案 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 )