2017-05-18 13 views
-2

私は2つのクラスがあります。一覧LINQの

私はまだクラスの一つのプロパティにアクセスできるようにしたい

と:私は、次のように1つのクエリでリストをフィルタリングするにはどうすればよい

public class One 
{ 
    string PropertyA; 
    string PropertyB; 
    List<Two> ListOfClassTwo; 
} 

public class Two 
{ 
    string MyString1; 
    string MyString2; 
} 

を; MyString1 == "Foo"と言ってListOfClass2をフィルタリングしたい

私は基本的にクラス1のクラス構造を保持したいと思いますが、ListOfClass2を好きなようにフィルタします。

私はそのクラス1を指摘しなければならない、それ自体は実際に IEnumerableを<ワン>

ありがとう列挙です!私が理解から

+3

だから、あなたはその質問を書いてどんな問題を抱えていますか?あなたの試行した解決策は何でしたか、どのようにしてあなたが望むものを達成できなかったのですか? – Servy

+0

元のクラス 'One'オブジェクトの' ListOfClassTwo'の内容を変更するか、新しいインスタンスを作成しますか? – juharr

+1

は最初のクエリとは関係ありませんが、プロパティを公開する必要がありますか? – Joe

答えて

0

、あなただけの内側のリストをフィルタリングし、その場合であるとして、外側のリスト内のすべての項目を残したい...

var listOfOnes = new List<One>() // assume this is populated with some stuff 

var result = listOfOnes.Select(i => { 
    i.ListOfClassTwo = i.ListOfClassTwo 
     .Where(j => j.MyString1 == "Foo") 
     .ToList(); 
    return i; 
}); 

...あなたが欲しいものを行う必要があります。変異LINQクエリについてコメントし、状況に

推敲...

listOfOnesは、その後、上記親スコープ(メソッド呼び出し)を行いメソッドに渡された場合、そのスコープがあるとして、何らかの方法で分割することができ

フィルタリングされた他の項目がそのコンテキストでフィルタリングされることを期待していません。

より良い解決策は、これは私がcloneメソッド内で「ワン」インスタンス変数にスカラのみ小道具をコピーするコピーのctorを使用し、次いで濾過新しいを提供するようなもの...

var result = listOfOnes.Select(i => { 
    var r = i.Clone(); 
    r.ListOfClassTwo = i.ListOfClassTwo 
     .Where(j => j.MyString1 == "Foo") 
     .ToList(); 
    return r; 
}); 

かもしれませんListOfTwoのプロパティの新しいOneの子のコレクション。

状況によっては、ここで少し再帰を使用してツリー全体を詳細に複製することは賢明かもしれませんが、このステートメントを包むコードについてもっと知らなくても、何らかのシナリオに合ったものを言うのは難しいです。

+0

スポットがあります!ありがとうございました。私は決して今夜それを持っていないだろう:) –

+1

これらのダウン投票が何であるかについては、私はそれがかなり良い質問だったと思った。 – War

+0

Linq内での突然変異は恐ろしい考えです。これは 'foreach'でなければなりません。もし' List'の 'ForEach'メソッドがもっとうまくいくならば。 – juharr