将2d数组转换为不同类型的2d数组。 int [,] => USHORT [,]

时间:2016-04-14 09:29:08

标签: c# .net linq

我试图找到一种方法,在一行代码中将一种类型的二维数组转换为另一种类型。

这是一种个人学习体验,而非需要在一行中完成!!

我已经把它转换成IEnumerable<Tuple<ushort,ushort>>了。不知道从哪里开始。

int[,] X = new int[,] { { 1, 2 }, { 3, 4 }, { 5, 6 } };

var Result = (from e in X.OfType<int>() select e)
                .Select(S => (ushort)S)
                .Select((value, index) => new { Index = index, Value = value })
                      .GroupBy(x => x.Index / 2)
                      .Select(g => new ushort[,] { { g.ElementAt(0).Value, 
                                                     g.ElementAt(1).Value } });

需要以某种方式将元组集合转换为ushort [,]

编辑:

只是澄清问题。

如何使用linq中的单行代码将int 2d数组转换为ushort 2d数组?

编辑:

我已经更新了我的代码。

我现在拥有它导致了ushort [,]的IEnumerable集合。

我现在需要找到一种方法将所有这些连接成一个单独的[,]

3 个答案:

答案 0 :(得分:3)

我能想出的最好的结果是二维的:

var input = new [,] { { 1, 2 }, { 3, 4 }, { 5, 6 } };
var output = new ushort[input.GetUpperBound(0) + 1, input.GetUpperBound(1) + 1];
Buffer.BlockCopy(input.Cast<int>().Select(x => (ushort)x).ToArray(), 0, output, 0, input.GetLength(0) * input.GetLength(1) * sizeof(ushort));

答案 1 :(得分:0)

使用显式转换为ushort我们可以做到这一点,我会留给您探讨转换中的后果并解决它们。

int[,] X = new int[,] { { 1, 2 }, { 3, 4 }, { 5, 6 } };
ushort[,] shortArray = new ushort[X.GetUpperBound(0)+1, X.GetUpperBound(1)+1];

for (int i = 0; i <= X.GetUpperBound(0); ++i) 
{
    for(int j=0;j<= X.GetUpperBound(1);j++)

        shortArray[i, j] = (ushort)X[i,j];         
}

如果您对Jagged数组而不是多维数组感兴趣,请使用此。

var jagged =  X.Cast<int>()     
               .Select((x, i) => new { Index = i, Value = x })
               .GroupBy(x => x.Index / (X.GetUpperBound(1) +1))
               .Select(x => x.Select(s=> (ushort)s.Value).ToArray())
               .ToArray();

工作example

答案 2 :(得分:-1)

怎么样:

var Result = X.OfType<int>().Select(s => new { Index = (s + 1) / 2, Value = s})
                            .GroupBy(g => g.Index)
                            .Select(s => s.Select(g => (ushort)g.Value).ToArray())
                            .ToArray();