如何在C#中将byte[,]转换为int[]
嘿,我来帮你梳理一下这个二维byte数组转一维int数组的问题~
首先说结论:你写的int[] tmp = items.Cast<int>().ToArray();其实是可以运行的,但它存在两个可以优化的点,而且可读性不算最好,我给你拆解下原因,再提供几个更合适的方案:
为什么你的代码能跑,但不够理想?
byte[,]是二维多维数组,在.NET里它实现的是非泛型的IEnumerable,而不是泛型的IEnumerable<byte>。所以当你调用Cast<int>()时,.NET会先把每个byte元素装箱成object,再拆箱转换成int——这会带来额外的性能开销,尤其是当数组很大的时候;另外,这段代码没直白体现出“把二维数组扁平化”的意图,其他开发者看的时候可能会愣一下。
更优的实现方案
1. 无装箱的LINQ写法(兼顾简洁和性能)
先把二维数组转成泛型的byte枚举,再转换成int,完全避免装箱操作:
int[] tmp = items.Cast<byte>().Select(b => (int)b).ToArray();
因为byte可以隐式转换成int,甚至可以简化成:
int[] tmp = items.Cast<byte>().Select(b => b).ToArray();
这段代码清晰表达了“先遍历二维数组的所有byte元素,再转成int,最后拼成一维数组”的逻辑,性能比你的原始代码好不少。
2. 手动循环写法(性能最优)
如果你的数组数据量很大,追求极致性能的话,直接用嵌套循环遍历填充是最好的选择——没有LINQ的额外开销:
// 获取二维数组的行数和列数 int rowCount = items.GetLength(0); int colCount = items.GetLength(1); int[] tmp = new int[rowCount * colCount]; int currentIndex = 0; // 按行优先遍历(默认顺序) for (int i = 0; i < rowCount; i++) { for (int j = 0; j < colCount; j++) { tmp[currentIndex++] = items[i, j]; } }
补充说明
不管用哪种方式,最终得到的int[]元素顺序都是行优先的——也就是先取第一行的所有元素,再取第二行,以此类推,这是.NET多维数组的默认遍历顺序,和你原始代码的结果是一致的。
内容的提问来源于stack exchange,提问作者random
相关产品推荐
相关产品推荐

