33

バイエル、メドレーなどの製薬会社をドロップダウンリストに入力しようとしています。また、DBから論文名を取得していますが、DBで論文名が繰り返されていますが、IDが異なります。

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

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

私は次のようなことを試みています:

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

これは、ddl で繰り返される会社を示しています。

ありがとう!

4

7 に答える 7

76

次の式は、異なる会社のみを選択し、最初に出現したものとその ID を返します。

partnerService.SelectPartners().GroupBy(p => p.Name).Select(g => g.First());
于 2009-05-26T19:29:11.983 に答える
16
var distinctCompanies = Companies
  .GroupBy(c => c.CompanyName)
  .Select(g => g.First());
于 2009-05-26T19:24:29.123 に答える
3

Distinct は選択全体で機能します。選択に c.codPartner を含め、同じ c.name に対して c.codPartner の 2 つの異なる値がある場合、同じ c.name を持つ 2 つの行が表示されます。

于 2009-05-26T19:13:17.337 に答える
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();
    }

}
于 2009-05-26T19:19:24.877 に答える
1

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

匿名型の 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();
于 2009-05-26T19:17:30.417 に答える
1

(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);
        });
      }
}
于 2009-05-26T19:28:18.867 に答える
0

他のオーバーロードのいずれかを使用して、独自の比較子を Distinct メソッドに渡すだけです。

(extension) IQueryable<T> IQueryable<T>.Distinct( IEqualityComparer<T> comparer )
于 2009-05-26T19:15:25.117 に答える