2009-05-26 14 views
33

私は、Bayer、Medleyなどの製薬会社にドロップダウンリストを入力しようとしています。そして、私はDBと論文から論文名を取得しています名前はDBで繰り返されますが、異なるIDを持ちます。Linq Distinct()名前で名前をつけるドロップダウンリスト

私はLinq Distinct()を使用しようとしていますが、私は等価比較子を使いたくありません。別の方法がありますか?

ドロップダウンリストには、会社のIDと名前を入力する必要があります。

私のような何かをしようとしている:

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

これは、DDLで繰り返さ企業を示しています。

ありがとうございました!

+0

企業が異なるIDで複数回表示され、それらを1回だけ表示したい場合は、どのIDを表示する必要がありますか?最初?関係ない? –

+0

IDはIDです – AndreMiranda

答えて

76

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 
} 

してから、このように使用次の式では、唯一の明確な企業を選択し、そのIDを持つ最初の発生を返します。

+0

こんにちはダニエル!それは私が必要としていたものでした!ありがとう! :-) – AndreMiranda

+0

ちょうど完璧! :) – rafek

+0

私が行うとき:dgvRecords.DataSource =(gからdbContext.recordsを選択するg).GroupBy(g => g.ID).Select(g => g.FirstOrDefault());私は取得:メッセージ=指定されたメソッドはサポートされていません。 Source = MySql.Data.Entity –

3

選択全体が独特です。 selectにc.codPartnerを組み込み、同じc.nameのc.codPartnerに2つの異なる値がある場合、同じc.nameを持つ2つの行が表示されます。

0

他のオーバーロードのいずれかを使用して独自の比較メソッドに渡してください。

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

名前は変わりませんが、同じ名前で異なるIDを持つ複数の企業がある場合、どのIDを使用するのですか? –

+0

私は同意します - IDの選択は問題になります。それぞれに固有のIDが必要な場合は、別名をEqualityComparerで使用すると、おそらく行くことができません。また、元の質問には、個別の結果の各項目の特定のIDを選択することについては何も言及していないことをここでdownvoteに留意してください... –

1

あなたがたIEqualityComparerパラメータを指定しない場合、それは単にオブジェクトGetHashKey値を見ている、Object.ReferenceEqualsを使用します。匿名型の場合、それらは一意です。

匿名型の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(); 
+0

ReferenceEqualsはハッシュコードを比較しません。参照を比較します... 2つの参照が同じインスタンスを指している場合にのみtrueを返します –

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

} 

のようなデータオブジェクトを作成した場合は作成することができますあなたがそれを言うドント場合Distincがに(たIEqualityComparer経由)GetHashCodeメソッドを使用します

class FooComparer : IEqualityComparer<Foo> 
{ 


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

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

} 
17
var distinctCompanies = Companies 
    .GroupBy(c => c.CompanyName) 
    .Select(g => g.First()); 
+0

尋ねると申し訳ありませんが、どこから 'g'が入りますか? – StarCub

+1

@StarCub CompaniesはIEnumerable です。 GroupByはそれを受け取り、IEnumerable >を返します。選択項目の各項目はIGrouping です。タイプの違いをより明確にするために別の名前を使用しました。 –

1

のような比較子オブジェクト別の方法を使用してください。 あなたはこのように、一般的なequalitycomparerを使用することができます(kindofが)

public static IEqualityComparer<YourType> MyComparer 
{ 
    get 
    { 
     return new GenericEqualityComparer<YourType>((x, y) => 
     { 
      return x.name.Equals(y.name); 
     }); 
     } 
} 
関連する問題