當你想鏈接這樣的邏輯,我想你真的想使用Linq。不幸的是,在多維數組上使用Linq會很麻煩。但是,有了一些輔助方法,我們可以將數據數組轉換爲更有用的方法。首先,讓我們構建的包裝類爲具有與之相關聯的3個維度的任何物體:
public class ThreeDimensionalArrayExtension<T> {
public int X { get; set; }
public int Y { get; set; }
public int Z { get; set; }
public T Value { get; set; }
}
接下來,讓我們寫出3- dimsensional陣列轉換爲新的類型的IEnumerables一個輔助方法:
public static class ThreeDimensionalArrayExtensionMethods {
public static IEnumerable<ThreeDimensionalArrayExtension<T>> ConvertArray<T>(this T[,,] foos) {
for(var x = 0; x < foos.GetLength(0); x++) {
for (var y = 0; y < foos.GetLength(1); y++) {
for (var z = 0; z < foos.GetLength(2); z++) {
yield return new ThreeDimensionalArrayExtension<T> { X = x, Y = y , Z = z, Value = foos[x, y, z] };
}
}
}
}
}
請注意,由於我們正在使用迭代器塊(yield-return模式),所以調用此方法實際上並不執行任何計算。
現在我們可以在您的三維陣列上使用Linq的強大功能來過濾它,但是我們想要!
myData.ConvertArray().Where(d => d.Value.Foo > 5)
.Where(d => IsPrime(d.Value.Foo))
.Where(...);
編輯: 我看到你正在使用3嵌套類,而不是一個多維數組,我以爲你是使用。目標仍然應該是將該對象轉換爲IEnumerable,您可以非常輕鬆地鏈接Linq查詢來過濾或投影數據。在你的情況下,你可以這樣做:
public static class ThreeDimensionalArrayExtensionMethods {
public static IEnumerable<ThreeDimensionalArrayExtension<X>> ConvertArray(this X[] foos) {
for(var x = 0; x < foos.Count(); x++) {
for (var y = 0; y < foos[x].Count(); y++) {
for (var z = 0; z < foos[x][y].Count(); z++) {
yield return new ThreeDimensionalArrayExtension<T> { X = x, Y = y , Z = z, Value = foos[x][y][z] };
}
}
}
}
}
然後使用相同的調用ConvertArray,然後使用上面所述的過濾Where子句。
如果你不關心X/Y/Z指數,也可以只使用SelectMany
項目多維列表到一個單一的維列表:
X.SelectMany(y => y.SelectMany(z => z)).Where(z => z.Foo > 5);
是真實的,我想它。併爲新條件傳遞新陣列,構建新陣列,檢查新條件,等等...... – 2013-05-08 15:44:31
爲什麼不一次檢查所有條件?它會讓你下降到一個3層for循環。 – XGundam05 2013-05-08 15:45:33
嗯,我認爲代碼將很難維護/添加/更改條件..但我可以試一試 – 2013-05-08 15:53:50