我试图找到一种方法,在一行代码中将一种类型的二维数组转换为另一种类型。
这是一种个人学习体验,而非需要在一行中完成!!
我已经把它转换成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集合。
我现在需要找到一种方法将所有这些连接成一个单独的[,]
答案 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();