2016-07-26 56 views
1

我有一個字符串列表:LINQ的合計值

List<string> strList = new List<string>(); 

strList.Add("first"); 
strList.Add("second"); 
strList.Add("third"); 
strList.Add("fourth"); 

我需要在每次迭代發送兩個字符串一些返回bool最後告訴結果是什麼方法。

例如:

  • 第一次迭代: 「第一」, 「第二」(返回true)
  • 第二次迭代: 「第二」, 「第三」(返回true)
  • 第三次迭代: 「第三」,「第四」(返回false)

所以所有的調用的返回值是false(執行這些返回值之間"&&")。

我必須使用LINQ所以我試着這樣做:

strList.Aggregate<bool>((prev, current) => Method(prev,current)); 

但不幸的是我做錯了什麼。

進一步解釋:

我想呼籲在strList所有連續字符串對布爾方法(字符串,字符串),並得到所有的結果

+0

改善您的規格。 「所以來自所有通話的返回值是錯誤的」。然而,你的第一次和第二次迭代是正確的。 –

+1

@HaraldDutch:OP希望爲'strList'中所有連續的'string'對調用'bool Method(string,string)',並獲得所有結果的布爾&&'。 – Groo

+1

只是爲了澄清,你是否想要短路(即在第一個「假」值後停止評估),或評估直到列表結束並返回最終結果? – Groo

回答

4

的一種方式可能是的布爾& &創建對,然後調用Enumerable.All,看看其中是否是假的:

// create tuples 
var pairs = strList 
    .Zip(strList.Skip(1), Tuple.Create); 

// check if all are true 
var result = pairs.All(p => Method(p.Item1, p.Item2)); 

然而,這是短期circuting(將小號在遇到第一個false之後進行最後評估),並且在編輯之後,似乎您想評估整個列表。

在這種情況下,在獲得元組後,可以使用Aggregate<Tuple<string>, bool>(即具有不同類型累加器的重載)。先從true,並使用布爾&

var finalResult = strList 
    .Zip(strList.Skip(1), Tuple.Create) 
    .Aggregate(true, (val, tuple) => Method(tuple.Item1, tuple.Item1) & val); 

如果你的方法會接受一個Tuple,它或許會稍微更具可讀性。

+0

關於使用linq進行這些相鄰類型比較的不幸之處在於實現很少出現短路。一旦發現錯誤,「All」將會停止,但直到您將整個集合壓縮成對後,纔會停止。 – Derpy

+0

@ Chee'sBurgers:你爲什麼說「很少」短路?恰恰相反,LINQ在其所有方法中都是懶惰的,並且在第一個「假」結果(當然是第一個例子)之後不會創建元組。就像「雙」本身不會評估任何東西。或者,例如'pairs.First()'只會創建一個元組。 – Groo

+0

'&'工程,但'&&'在這裏更合適。 – Kit

0

這種方法使用的Aggregate一個different overload,避免了Zip(),但假定你以這樣的方式來處理在初始空字符串作爲分手的種子元組的代碼Method

 var result = strList.Aggregate(
      Tuple.Create("", true), 
      (val, current) => Tuple.Create(current, val.Item2 & Method(val.Item1, current)), 
      val => val.Item2); 

你可以在工作中使用this .NET Fiddle看到這個。它不處理列表中只有一個項目的情況,但是接受的答案也不是。我想我們可以認爲這將受到某處檢查的保護。