2012-05-17 56 views
3

給定兩個數組:切片陣列基於選擇口罩

double[] a = new double[]{1.0, 2.0, 3.0}; 
bool[] b = new bool[]{true, false, true}; 

有一個簡單的方法基於ba選擇?在R和其他腳本語言中,你會說:

a[b] 

得到{1.0, 3.0}。我無法弄清楚在C#中是否存在乾淨的(沒有顯式循環)方式。也許我應該組織不同的數據?

回答

5

你可以做到這一點使用LINQ:

double[] a = new double[]{1.0, 2.0, 3.0}; 
bool[] b = new bool[]{true, false, true}; 
var result = a.Where((item, index)=>b[index]); 
+0

這實現了什麼? – Jon

+0

@Jon,謝謝你指出錯誤。我已經修復了代碼。 – RePierre

+0

錯誤的用法。條件在哪裏?它只會給出結果的副本。 –

6

使用LINQ Zip方法,如:

a.Zip(b, (i, j) => new {i, j}).Where(x => x.j).Select(x => x.i) 
+1

+1郵編:D:D –

+0

@DaveBish,謝謝。 –

+1

不錯的方法,不知道Zip方法。 –

4

還有這個比較傳統的LINQ方法:

b.Select((f, i) => f ? i : - 1).Where(i => i != -1).Select(i => a[i]);