Dot-Net

替換 for… if 數組迭代

  • June 25, 2011

我喜歡 Python 中的列表推導,因為它們簡潔地代表了列表的轉換。

然而,在其他語言中,我經常發現自己在寫一些類似的東西:

foreach (int x in intArray)
 if (x > 3) //generic condition on x
   x++ 
   //do other processing

這個例子是用 C# 編寫的,我的印像是 LINQ 可以幫助解決這個問題,但是是否有一些通用的程式結構可以替代這個稍微不那麼優雅的解決方案?也許我不考慮的資料結構?

原始foreach循環中的增量不會影響數組的內容,這樣做的唯一方法仍然是for循環:

for(int i = 0; i < intArray.Length; ++i)
{
   if(intArray[i] > 3) ++intArray[i];
}

Linq 不打算修改現有的集合或序列。它基於現有序列創建新序列。使用 Linq 實現上述程式碼是可能的,儘管它稍微違背了它的目的:

var newArray1 = from i in intArray select ((i > 3) ? (i + 1) : (i));
var newArray2 = intArray.Select(i => (i > 3) ? (i + 1) : (i));

如其他一些答案所示,使用where(或等效)將從結果序列中排除任何小於或等於 3 的值。

var intArray = new int[] { 10, 1, 20, 2 };
var newArray = from i in intArray where i > 3 select i + 1;
// newArray == { 11, 21 }

數組上有一個ForEach方法可以讓你使用 lambda 函式而不是foreach塊,儘管除了方法呼叫之外我會堅持使用foreach.

intArray.ForEach(i => DoSomething(i));

引用自:https://stackoverflow.com/questions/13396