2017-06-28 100 views
1

我有一個2D陣列 int[,] b = { { 1, 0, 1, 1 }, { 1, 1, 0, 1 }, { 0, 0, 0, 1 } };最快的方式

我想通過元件以這樣的方式來檢查在數組元素的條件,如果數組索引的前一值是從當前值不同數組然後我的一個計數器得到遞增。整個數組的返回類型也是一維數組。 這裏的行表示我的通道,列表示樣本值的數量。

我可以通過2個循環來做到這一點,並按元素進行比較,因爲我已經在delphi7中做了同樣的事情,但現在我正在C#上工作。那麼有沒有什麼聰明和最快的方法來做同樣的事情?請告訴。

以上陣列的輸出是 int [] output = {2}1->0所以再次遞增然後0->1然後再次遞增一個,這樣相同的狀態所以沒有增量所以合計值爲2

同樣爲所有othere元素,以便輸出將[2,2,1]

回答

3

它可以使用LINQ做我猜。

int[,] b = { { 1, 0, 1, 1 }, { 1, 1, 0, 1 }, { 0, 0, 0, 1 } }; 

var result = Enumerable.Range(0, b.GetLength(0)) 
     .Select(row => Enumerable.Range(0, b.GetLength(1)-1).Count(col => b[row, col + 1] != b[row, col])).ToArray(); 

其中:

b.GetLength(0) - 獲取的行數陣列

b.GetLength(1) - 取得數組的列數

Count(y => b[row, col + 1] != b[row, col])) - 只計算不同的項目

+0

你能解釋一下值x和y保持不變,因爲根據linq x應該有數組b的行長度,y應該有數組的列長度。但根據代碼,它似乎不同。 –

+0

我已編輯上面的代碼。 'x'正在處理行號,'y'正在處理列號。我已將其更改爲行和列。這是因爲行來自於'Enumerable.Range(0,b.GetLength(0))',它是行0的範圍到數組中的行數。類似的是列。當我將項目與下一項目進行比較時,範圍減少1項。 –