バイエル、メドレーなどの製薬会社をドロップダウンリストに追加しようとしています。また、DBからこれらの名前を取得していますが、DBではこれらの名前がIDが異なります。
Linq Distinct()を使用しようとしていますが、等値比較器は使用したくありません。別の方法はありますか?
ドロップダウンリストには、会社のIDと名前を入力する必要があります。
私は次のようなものを試しています:
var x = _partnerService
.SelectPartners()
.Select(c => new {codPartner = c.codPartner, name = c.name})
.Distinct();
これは、ddlで繰り返される会社を示しています。
ありがとう!
次の式は、別個の会社のみを選択し、そのIDを持つ最初の出現を返します。
partnerService.SelectPartners().GroupBy(p => p.Name).Select(g => g.First());
var distinctCompanies = Companies
.GroupBy(c => c.CompanyName)
.Select(g => g.First());
明確な選択全体で動作します。 selectにc.codPartnerを含め、同じc.nameにc.codPartnerの2つの異なる値がある場合、同じc.nameの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();
}
}
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();
(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);
});
}
}
他のオーバーロードのいずれかを使用して、独自の比較子をDistinctメソッドに渡すだけです。
(extension) IQueryable<T> IQueryable<T>.Distinct( IEqualityComparer<T> comparer )