2016-06-11 9 views
1

難しいLINQ式がありますが、なぜ動作しないのかわかりません。私が手に構文エラーがなぜこのLINQ Select式が機能しないのですか

は、用法から推測することはできませんEnumerable.Select<TSource, TResult>(IEnumerable<TSource>, Func<TSource, TResult>)の引数の型です。型引数 を明示的に指定してみてください。

エラーは2番目のSelectステートメントx.Selectにあります。私はallFactorsからリストの各リストの1つの要素をつかみ、一緒に追加し、一緒に追加された各グループのそれぞれをtempListに保持しようとしています。言い換えれば、個々の要素をまとめてtempListとし、その合計がtempであることを知りたいと思います。

コードallFactorsには値が入っています。どのようにタイプを明示的に指定するか、あるいは別の方法でこれを行うことができます。私はなぜ型が推論されないのか理解できません。

int temp = 0; 
//List<List<int>> allFactors = new List<List<int>>(); 
List<int> tempList = new List<int>(); 
allFactors.Select(x => x.Select(y => { temp += y; tempList.Add(y); })); 

EDIT: David Lの答えは構文エラーを修正します。残念なことに、さらにテストをすると、私のコードは私がしたいことをしていないことに気付きました。私が本当に望むのは、各グループがリストのリストから唯一の要素で構成されているすべての順列を得ることです。例として:

List<List<int>> oldList = {{1,2},{3,4}}; 
List<List<int>> newList = {{1,3},{1,4},{2,3},{2,4}}; 

私はnewListoldListを変換するいくつかの方法を探しています。課題は、ネストされたリストがいくつあるか、各リストに含まれるアイテムの数がわからないことです。何か案は?これまでの皆さんのご意見ありがとうございます。

+0

タイプは何をすべてのファクタの? –

+0

2番目の 'Select'節は何も返しません。 – MarcinJuraszek

+0

"tempList"に "allFactors"の各リストの最初の要素だけを入れたいですか? –

答えて

4

内部選択で何も返さないため、型を推測できません。コンパイラは結果として外側の選択を推論するものがありません。

さらに、選択したリターンを使用していないため、代わりに.ForEach()を使用できます。

int temp = 0; 
List<List<int>> allFactors = new List<List<int>>(); 
List<int> tempList = new List<int>(); 
allFactors.ForEach(x => x.ForEach(y => { temp += y; tempList.Add(y); })); 

あなたは.Select()に固執したい場合は、内側の選択から値を返すと外側の選択のための.SelectMany()を使用する必要があります。

int temp = 0; 
List<List<int>> allFactors = new List<List<int>>(); 
List<int> tempList = new List<int>(); 
List<int> selectedList = allFactors.SelectMany(x => x.Select(y => 
       { 
        temp += y;  
        tempList.Add(y); 
        return y; 
       })).ToList(); 

これはtempListのためのあなたの最終目標に沿ったものであるように思われ、List<int>を「フラット化」を生成することになります。

+0

あなたの明確な説明に感謝します!非常に役に立ちました、私はLinqの使い方を浅く知っていて、何かを返すために必要な 'Select'を認識しませんでした。私はあなたが今何を意味しているのかを見てきました。私は質問を明確にしたので、編集を見てください。 – michaelto20

+0

@ michaelto20ご清聴ありがとうございます。しかしこの場合、質問の性質が大きく変わったので、新しい質問を作成する方が良いでしょう。 –

+0

良い提案、ここに新しい投稿があります。http://stackoverflow.com/questions/37791100/creating-a-list-getting-an-element-from-each-nested-list – michaelto20

1

あなただけの「allFactorsを」フラット化する場合は、この方法で行くことができます:あなたは、各リストの最初の要素だけが必要な場合

 var tempList = allFactors.SelectMany(x => x).ToList(); 
     var temp = tempList.Sum(); 

が、それは次のようになります。

 var tempList = allFactors.Select(x => x.First()).ToList(); 
     var temp = tempList.Sum(); 
関連する問題