2017-06-28 101 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项。 –