2017-09-25 6 views
1

私はC#WPFでアプリケーションを開発していますが、データ用にEF6.0フレームワークを使用しています。私は、観測可能なコレクションをフィルタリングするか、特定のプロパティの別個の値を表示するための最良の方法が何であるかについて、少し混乱しています。私はこのコードでやろうとしましたが、成功しませんでした。これは、一意のSWバージョンpublic void getuniquesw()をフィルタリングしようとする方法です。私はイコール性の比較可能な方法をチェックしましたが、それを理解できませんでした。どのような方法で最も簡単なフィルタリング/個別の値になりますか。C#WPFのフィルタで観測可能なコレクション

public List<CREntity> crentities 
{ 
    get; 
    set; 
} 

// Obeservable collection property for access 
private ObservableCollection<CREntity> _CRmappings2 = new ObservableCollection<CREntity>(); 
public ObservableCollection<CREntity> CRmappings2 
{ 
    get { return _CRmappings2; } 
    set 
    { 
     _CRmappings2 = value; 
     RaisePropertyChanged("CRmappings2"); 
    } 
} 

public void UpdatePopList() 
{ 
    CRmappings2 = new ObservableCollection<CREntity>(crentities.Where(p => p.MU_Identifier == selectmu.ToString()).ToList()); 
} 

public void getuniquesw() 
{ 

    CRmappings2 = new ObservableCollection<CREntity>(crentities.Select(p=>p.SW_Version).Distinct()); 
} 

エンティティクラスの定義

using DataModel; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace BusinessEntities 
{ 
    public class CREntity 
    { 
     public long C_ID { get; set; } 
     public string LogName { get; set; } 
     public string xSCR_BUG { get; set; } 
     public string RequestType { get; set; } 
     public string MU_Type { get; set; } 
     public long CPC2_OBD_1Byte { get; set; } 
     public long INS_OBD_1Byte { get; set; } 
     public string MU_Identifier { get; set; } 
     public string Old_MU { get; set; } 
     public int? SPN { get; set; } 
     public int? FMI { get; set; } 
     public string Triggers { get; set; } 
     public string Comment { get; set; } 
     public string Status { get; set; } 
     public string SW_Version { get; set; } 
     public DateTime? Create_Date { get; set; } 
     public DateTime? Upd_Date { get; set; } 
     public virtual ICollection<Fault_Details> FaultDetails { get; set; } 

    } 
} 
+0

私はしません誰かがあなたを助けることができるここで一つの明確な問題があることを知ってください。正直なところ、いくつかの概念について根本的に誤解があるようです。 ObservableCollectionがあなたの使い方に基づいて解決しようとしている問題を理解していることは明らかではありません。私は 'getuniquesw'の実装に基づいて型を完全に理解しているかどうかはわかりません。そして、私はあなたが「イコール不等理比較メソッド」がこれにどのように適合していると思いますか分かりません。私はあなたが一歩一歩ずつ、それぞれの問題に取り組む方法を見つけ出す必要があると思います。すみません、私はもっと助けてもらえません。 –

+0

@JasonBoydありがとうございます、タイプベースの実装についてもっと調べてみましょう。 –

+0

@ mm8定義を追加しました –

答えて

1

IEqualityComparer<CREntity>を実装するクラスを作成します。

public class CREntityComparer : IEqualityComparer<CREntity> 
{ 
    public bool Equals(CREntity x, CREntity y) 
    { 
     if (x != null && y != null && x.C_ID.Equals(y.C_ID)) 
      return true; 

     return false; 
    } 

    public int GetHashCode(CREntity obj) 
    { 
     if (obj == null) 
      return -1; 

     return obj.C_ID.GetHashCode(); 
    } 
} 

を...とDistinct()方法には、このいずれかのインスタンスを渡します

public void getuniquesw() 
{ 
    CRmappings2 = new ObservableCollection<CREntity>(crentities.Select(p => p.SW_Version).Distinct(new CREntityComparer())); 
} 
+0

ありがとうございました。私はobservableコレクションを使用しているので、私は常にIequalitycomparerを使用する必要がありますが、他のフィルタリング方法もありますか? –

+0

ほとんどすべてを行うさまざまな方法があります。しかし、この場合、2つのCREntityオブジェクトが等しいとみなされるときを定義する必要があります。 – mm8

+0

はい、今私の評判は15と今私はupvoteすることができます:) –

関連する問題