2016-05-07 8 views
0

をIEnumerableを処理し、サブエンティティから不一致の項目を削除するLINQ私は最近、私の仕事で問題が発生している、、以下のソースコード

this.NameList = new ObservableCollection<Name>(); 

     List<Others> others1 = new List<Others>(); 
     others1.Add(new Others() { Company = "Company1", School = "School1" }); 
     others1.Add(new Others() { Company = "Company1", School = "School1" }); 
     others1.Add(new Others() { Company = "Company1", School = "School1" }); 

     List<Others> others2 = new List<Others>(); 
     others2.Add(new Others() { Company = "Company2", School = "School2" }); 
     others2.Add(new Others() { Company = "Company2", School = "School2" }); 
     others2.Add(new Others() { Company = "Company2", School = "School2" }); 

     List<Others> others3 = new List<Others>(); 
     others3.Add(new Others() { Company = "Company3", School = "School3" }); 
     others3.Add(new Others() { Company = "Company3", School = "School3" }); 
     others3.Add(new Others() { Company = "Company3", School = "School3" }); 

     this.NameList.Add(new Name() { FirstName = "Jacob", LastName = "Deng", Others = others1 }); 
     this.NameList.Add(new Name() { FirstName = "David", LastName = "Xu", Others = others2 }); 
     this.NameList.Add(new Name() { FirstName = "Helen", LastName = "Liu", Others = others3 }); 

please click here to see the output of above code

し、次のコードを読んでください、

List<Others> others1 = new List<Others>(); 
     others1.Add(new Others() { Company = "Company1", School = "School1" }); 
     others1.Add(new Others() { Company = "Company1", School = "School1" }); 
     others1.Add(new Others() { Company = "Company1", School = "School1" }); 

     List<Others> others2 = new List<Others>(); 
     List<Others> others3 = new List<Others>(); 

     this.NameList.Add(new Name() { FirstName = "Jacob", LastName = "Deng", Others = others1 }); 
     this.NameList.Add(new Name() { FirstName = "David", LastName = "Xu", Others = others2 }); 
     this.NameList.Add(new Name() { FirstName = "Helen", LastName = "Liu", Others = others3 }); 

Please click here for the output of the second snippet code

上の2つのスニペットから、2番目のスニペットにother2とother3の項目が含まれていないことがわかります。プレビュー出力から簡単に理解できます。

ここで、LINQを使用してIEnumerableにこのようなケースを処理する方法、LINQを使用して他のエンティティからアイテムを削除する方法について質問します。 other2とother3をnullにしないようにする必要があります(カウントは0にしておきます)。 LINQに加えて、他の解決策はありますか?

私はちょうどいくつかのテストをした私たちは、LINQを使用しない場合は、その後、私たちは私のそれを修正するには、以下のスニペットコードを使用することができます

次を使用しようとしましたが、失敗し、

var others = ((MyVM)DataContext).NameList.Select(n => n.Others.Where(o => o.School == "School1")).ToList(); 

ObservableCollection<Name> nameList = ((MyVM)DataContext).NameList; 
     foreach(Name n in nameList) 
     { 
      List<Others> removeList = new List<Others>(); 
      for(int i=0;i<n.Others.Count;i++) 
      { 
       if(n.Others[i].School!="School1") 
       { 
        removeList.Add(n.Others[i]); 
       } 
      } 
      foreach(Others other in removeList) 
      { 
       n.Others.Remove(other); 
      } 
     } 

しかし、それは非常に冗長に見える、と私たちはLINQは非常に有用であり、私はそれはLINQで固定することができると考えていることを知っています。誰かがLINQで修正するのを助けてくれることを願っています。

誰かが私を助けることができたら大変感謝します。どうもありがとう。

+0

で他の人がリストを取得するためのコードの下に試すことができます。var他人=((myvmに)のDataContext).NameList.Select(N => n.Others.Select(Oを=>(o.School == "School1")?o: "ここにコードを追加して別のことをする"))。ToList(); – jdweng

+0

ありがとうJdweng、私はちょうど学校がLINQで 'School1'と等しくないそれらのアイテムを削除したい、出力は上記のように2番目のスニペットコードと同じです。私たちを手伝ってくれますか? – Jacob

+0

o.School!= 'School1'のときは、他のエンティティからアイテムを削除します。 – Jacob

答えて

2

あなたのケースではList<T>.RemoveAllを使用することをお勧めします。詳細はUsing LINQ to remove elements from a List<T>を参照してください。

ObservableCollection<Name> nameList = ((MyVM)DataContext).NameList; 
foreach(Name n in nameList) 
{ 
    n.Others.RemoveAll(s => s.School != "School1"); 
} 

Linqは、更新/削除の代わりに読み取り専用の反復処理が有効です。あなたがLinqを使用すると主張する場合は、各アイテムを再構築する必要があります。上記のコード

var newList = from nl in this.namelist 
       // this list can be empty but never null 
       let notSchool1 = (from s in nl.Others 
            where s.School != "School1" 
            select s).ToList() 
       select new Name 
       { 
        FirstName = nl.FirstName, 
        LastName = nl.LastName, 
        Others = noSchool1 
       }; 
this.NameList = new ObservableCollection<Name>(newList); 

これらの項目はを観察されているため、アプリケーション内の他の機能を破壊することがあります。

+0

ありがとうございました。非常に美しいコード! @qxg – Jacob

0

私はあなたの質問を理解しているので、 学校の価値が「School1」ではないものを削除したいと考えています。そこには別の方法がありますが、あなたが望むNameListからデータをフィルタリングすることをお勧めします。

あなたはこの試してみてください 'School1'

var result = NameList.Select(name => new Name() 
      { 
       FirstName = name.FirstName, 
       LastName = name.LastName, 
       Others = name.Others.Where(obj => obj.School == "School1").ToList() 
      } 
      ).ToList();