【发布时间】:2016-01-06 09:23:39
【问题描述】:
我已经用默认值0xFF 初始化了一个大小为20 的数组,如下所示:
Byte[] tempArray = Enumerable.Repeat((Byte)0xFF, 20).ToArray();
现在我想将每 4 个位置的值更改为其他值,例如 0xA0。
它的 Linq 表达式应该是什么?
【问题讨论】:
标签: c# .net linq linq-to-sql lambda
我已经用默认值0xFF 初始化了一个大小为20 的数组,如下所示:
Byte[] tempArray = Enumerable.Repeat((Byte)0xFF, 20).ToArray();
现在我想将每 4 个位置的值更改为其他值,例如 0xA0。
它的 Linq 表达式应该是什么?
【问题讨论】:
标签: c# .net linq linq-to-sql lambda
您可以使用Enumerable.Range,然后根据索引将索引投影到所需的值:
Byte[] tempArray = Enumerable
.Range(0, 20)
.Select(i => i%4 != 0 ? (Byte) 0xFF : (Byte) 0xA0)
.ToArray();
【讨论】:
.Range(1, 20),否则第一个字节已经算第四个了
0xA0 的值以及您喜欢如何编写 i%4 = ? 表达式。将Range(0, 20) 替换为Range(1, 20) 会产生不同的结果。
LINQ 旨在访问数据,而不是对其进行修改。如果您从 20 个 0xFFs 的数组开始,则 LINQ 不适合对其进行更改。
但是,您可以使用 LINQ 在旧数组的基础上构造一个新数组:
var res = tempArray.Select((v, i) => i % 4 != 0 ? v : (Byte)0xA0).ToArray();
这会生成一个全新的数组,而不是在原地更改 tempArray。您可以将res 复制到tempArray,或者如果您想更改tempArray,请进行分配。
【讨论】:
tempArray = tempArray.Select((b, i) => i % 4 == 0 ? (byte)0xA0 : b).ToArray();
【讨论】:
如果你真的想创建一个具有交替值的新数组,你已经有了很好的工作答案。
但是没有人展示修改现有数组的常规方法是使用 for 循环:
for (int i = 0; i < tempArray.Length; i++)
if ((i + 1) % 4 == 0)
tempArray[i] = 0xA0;
【讨论】: