2010-12-13 51 views
2

如果我想通過集合進行迭代,並調用集合中的每個元素上的功能,我可以去:調用LINQ查詢中的一個函數

foreach (var obj in objColl) 
{ 
    MyFunction(obj); 
} 

如果我想使用LINQ來做到這一點,我可以使用其中的任何一種:

//#1 
var unused = (from var obj in objColl select MyFunction(obj)).ToList(); 

//#2 
var unused = objColl.Select(obj => MyFunction(obj)).ToList(); 

我知道這是有效的,但它看起來不正確。當然,我的實際情況是這樣的更復雜的查詢,但歸結到這一點,因爲我可以用Linq構建我的IQueryable並遍歷它並調用該函數。

編輯: 這是我做的一個例子。 (編號:有些事情我不能透露)

var dummyValue = (from 
        Item7 in dal.GetAgencyConvertions().Where(age => age.SourceName == "Item1" && age.TargetName == "Item2") 
        join Item6 in dal.GetAgencyConvertions().Where(age => age.SourceName == "Item2" && age.TargetName == "Item3") on Item6.TargetValue equals Item7.SourceValue 
        join agency in dal.GetAgencies() on Item7.SourceValue equals agency.Agency 
        orderby Item7.TargetValue 
        select vl.ValueListItems.Add(agency.ID, Item7.TargetValue)).ToList(); 

回答

5

圍棋與簡單foreach,因爲你顯然想執行上的操作(和/或使用)您的集合中的對象,而不是希望項目/過濾/組/等。序列中的項目。 LINQ是關於後一組操作的。

編輯:在更新的情況下,我只需創建一個查詢,然後遍歷foreach中的查詢來執行操作。

var query = from Item7 in dal.GetAgencyConvertions().Where(age => age.SourceName == "Item1" && age.TargetName == "Item2") 
      join Item6 in dal.GetAgencyConvertions().Where(age => age.SourceName == "Item2" && age.TargetName == "Item3") on Item6.TargetValue equals Item7.SourceValue 
      join agency in dal.GetAgencies() on Item7.SourceValue equals agency.Agency 
      orderby Item7.TargetValue 
      select new { ID = agency.ID, Value = Item7.TargetValue }; 

foreach (var item in query) 
    vl.ValueListItems.Add(item.ID, item.Value); 

坦率地說,你有同樣的循環在代碼中發生的事情,你只是使用ToList()擴展方法掩蓋它。作爲副產品,您正在創建一個您無意使用的值列表,同時有些混淆了代碼的真實意圖,所有這些都可以節省幾個字符。

+0

即使CIL中的結果很可能是相同的,但我仍然會這樣做,只是爲了保持代碼清晰。謝謝。 – Tipx 2010-12-13 20:35:51

1

通常情況下,查詢不應該有任何副作用(即它不應該修改你的應用程序中的數據或其他數據的狀態),這提出了一個問題,MyFunction修改應用程序的狀態?如果是這樣,那麼你應該使用foreach循環。

+0

那麼,我的一個案例是創建一個價值清單。如果你不熟悉它,它是一種Infragistics類型的自定義字典。我會更新我的問題以獲得此示例。 – Tipx 2010-12-13 19:32:11

1

Every()擴展方法如何?

public static void Each<T>(this IEnumerable<T> target, Action<T> action) 
{ 
    if (target == null) return; 
    foreach (T obj in target) 
     action(obj); 
} 
+0

不是一個可怕的答案,但我認爲,有一些[堅定的意見](http://blogs.msdn.com/b/ericwhite/archive/2009/04/08/why-i-don-t- use -the-foreach-extension-method.aspx)爲什麼不這樣做。 :) – 2010-12-13 19:45:54