2

DropDownList にバインドする次のクエリを取得しました。

if (!Page.IsPostBack)
        {
            var branchTags =
                (
                    from t in context.ContactSet
                    orderby t.py3_BranchArea
                    where t.py3_BranchArea != null
                    select new
                    {
                        BranchTagCode = t.py3_BranchArea,
                        BranchTag = (t.FormattedValues != null && t.FormattedValues.Contains("py3_brancharea") ? t.FormattedValues["py3_brancharea"] : null)
                    }
                ).Distinct();
            ddlBranchTags.DataSource = branchTags;
            ddlBranchTags.DataBind();
        }

何らかの理由で、視覚的に同じである 2 つの行を配置します。CRM に同じ名前のエンティティが 2 つある場合があります。しかし、クエリでdistinctを使用して「py3_brancharea」のみを返す場合、返された実際のレコードでDistinctを実行する必要がありますか?

したがって、これは私に、そして私の限られたLINQの知識に、それが次の行によるものであることを示唆しています:

BranchTagCode = t.py3_BranchArea

ただし、FormattedValues を呼び出せるようにするには、これを呼び出す必要があります。

では、純粋に 'BranchTag' に基づいて個別の結果セットを取得するにはどうすればよいですか?

4

6 に答える 6

3

が機能しない場合Distinct()は、特定のクラスgethashcode()またはequals()オーバーライド メソッドに問題がある可能性があります。これらは正しく設定されていないか、完全に省略されています。カスタム クラスでは、ほとんどの場合、これらのオーバーライドを指定して取得Distinct()し、他の同様のメソッドを正しく機能させる必要があります。

where または any 句を使用して、重複を区別することもできます。これは、問題の回避策になる可能性がありDistinct()ます。

Distinct()カスタム クラスを使用してメソッドを設定する方法をさらに説明する。検索するクラス内で、オーバーライド メソッドGetHashCode()とを設定する必要がありますEquals()。これらまたはオブジェクト レベルのメソッドは、何があってもすべてのクラスに存在する必要があります。問題のクラスに向かい、次のように入力します。

public override bool Equals(object obj) それから public override int GetHashCode()

オーバーライドの前にこの単純なクラスがあるとしましょう:

class foo{
   int H {get;set;}
   public foo(int _h){
        H = _h;
   }
}

これは次のようになります。

class foo{
   int H {get;set;}
   int K {get;set;}

   public override bool Equals(object obj){
         if(obj == null) return false;
         foo test = (foo)obj);
         if(test == null) return false;
         
         if(this.H == obj.H && this.K == obj.K) return true;
   }
   public override int GetHashCode(){
         int hashH = H.GetHashCode();
         int hashK = K.GetHashCode();

         return hashH ^ hashK;
   }

   public foo(int _h){
        H = _h;
   }
}

これで、次のようなクラスDistinct()を含む Ienumerable 型で使用できます。foo

 List<foo> FooList = new List<foo>(Collection of 9 Foos);
 var res = FooList.Distinct();
于 2013-04-30T00:22:47.823 に答える
1

私にとってはうまくいったが、すべての状況でうまくいかないかもしれない別のはるかに簡単な方法は、この人の方法(GroupBy()およびFirst())を使用することです:

リスト内の個別の要素を見つける

彼はとでを作成しList<Customer> customersます。次に、それらをすべてグループ化し、各グループから最初の要素を取得します!FirstNameLastNameFirstName

`
List< Customer > customers = new List< Customer >;
{
    new Customer {FirstName = "John", LastName = "Doe"},
    new Customer {FirstName = "Jane", LastName = "Doe"},
    new Customer {FirstName = "John", LastName = "Doe"},
    new Customer {FirstName = "Jay",  LastName = null},
    new Customer {FirstName = "Jay",  LastName = "Doe"}
};
`

それで:

`
var distinctCustomers = customers.GroupBy(s => s.FirstName)
                                 .Select(s => s.First());
`

私の状況では、私は使用しなければなりFirstOrDefault()ませんでした。

于 2014-11-28T18:36:25.313 に答える
0

匿名型の既定の等値比較では、大文字と小文字が区別されます。期待される戻り値の大文字と小文字は異なりますか? Matt が示唆したように、それ以外の場合は、カスタム クラスのカスタム IEqualityComparer 実装を見たいと思うかもしれません。

于 2013-04-30T08:20:18.947 に答える