2011-10-11 75 views
4

假設我有一個IEnumerable<string>類型的給定對象,它是方法SomeMethod()的返回值,它不包含重複的元素。我希望能夠「壓縮」在一個單一的LINQ查詢下面幾行:單個LINQ查詢可以實現嗎?

IEnumerable<string> someList = SomeMethod(); 

if (someList.Contains(givenString)) 
{ 
    return (someList.Where(givenString)); 
} 
else 
{ 
    return (someList); 
} 

編輯:我錯誤地使用Single代替First。現在更正。

我知道我可以通過使用三元運算符來「拉」這個,但這不是重點。我只列出能夠用一條線實現這一點。那可能嗎?

+1

該方法的返回類型是什麼? – jjnguy

+0

返回類型是'IEnumerable '。 – DotNetStudent

+2

您正在返回一個IEnumerable和一個字符串。 – mmcdole

回答

2

所需輸出的本質要求,你要麼讓兩個請求的數據,像你現在的樣子,或緩衝不匹配,返回,如果沒有找到匹配。後者在實際獲取數據是相對昂貴的調用(例如:數據庫查詢或WCF服務)的情況下特別有用。緩衝方法是這樣的:

static IEnumerable<T> AllIfNone<T>(this IEnumerable<T> source, 
            Func<T, bool> predicate) 
{ 
    //argument checking ignored for sample purposes 
    var buffer = new List<T>(); 
    bool foundFirst = false; 
    foreach (var item in source) 
    { 
     if (predicate(item)) 
     { 
      foundFirst = true; 
      yield return item; 
     } 
     else if (!foundFirst) 
     { 
      buffer.Add(item); 
     } 
    } 

    if (!foundFirst) 
    { 
     foreach (var item in buffer) 
     { 
      yield return item; 
     } 
    } 
} 

這種方法的懶惰是要麼的WhereToList取決於如果集合包含匹配與否。如果確實如此,則應該執行類似於Where的執行。如果沒有,你將大致執行調用ToList(以及所有失敗的過濾器檢查的開銷)並迭代結果。

4

這將返回給定的字符串項目或如果給所有項目沒有出現在列表中:

someList.Where(i => i == givenString || !someList.Contains(givenString)) 
+0

如果有元素不是givenString,那麼這個調用是否包含很多次? – Joey

0

這是不可能改變的方法,返回類型,是你問。第一個條件返回一個字符串,第二個條件返回一個字符串集合。

只返回IEnumerable<string>收集,並在返回值是這樣叫Single

string test = ReturnCollectionOfStrings().Single(x => x == "test"); 
2

有什麼不對的三元運算符?

someList.Any(s => s == givenString) ? someList.Where(s => s == givenString) : someList; 

這將是更好的做任何之後,但我不能想到如何單行。

var reducedEnumerable = someList.Where(s => s == givenString); 

return reducedEnumerable.Any() ? reducedEnumerable : someList; 
相關問題