2016-06-11 73 views
1

我有一個困難的LINQ表達式,我不明白爲什麼它不起作用。我得到的語法錯誤是爲什麼不這個LINQ選擇表達式工作

Enumerable.Select<TSource, TResult>(IEnumerable<TSource>, Func<TSource, TResult>)的參數類型不能由使用推斷出 。嘗試明確指定類型參數 。

錯誤在第二個Select聲明,x.Select。我試圖從allFactors中抓取列表的每個列表中的一個元素,並將它們添加在一起,並將每個分組的每個分組保存在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); })); 

編輯: David L的答案確實修復了語法錯誤!不幸的是,隨着進一步的測試,我意識到我的代碼沒有做我想做的事情。我真正想要的是獲得每個組的排列,每個組只由列表中的一個元素組成。舉個例子:

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

我正在尋找一些方法來oldList轉換成newList。我面臨的挑戰是我不知道每個列表中會有多少嵌套列表或多少個項目。有任何想法嗎?感謝大家迄今爲止的想法。

+0

什麼類型所有因素? –

+0

你的第二個'Select'子句不返回任何東西。 – MarcinJuraszek

+0

你是否想在「tempList」中只放置每個「allFactors」列表的第一個元素? –

回答

4

無法推斷該類型,因爲您沒有通過inner select返回任何內容。作爲結果,編譯器沒有任何推斷外部選擇的內容。

此外,由於您沒有使用選定的退貨,因此可以使用.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(); 

這將產生一個「扁平化」 List<int>,這似乎是在與tempList你的最終目標線。

+0

感謝您的明確解釋!非常有幫助,我只知道如何使用Linq,並沒有意識到需要返回一些東西。我明白了,我已經查看了文檔。我已經澄清了該問題,請參閱編輯。 – 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(); 
相關問題