Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用于更改数组值的Linq表达式_C#_.net_Linq_Linq To Sql_Lambda - Fatal编程技术网

C# 用于更改数组值的Linq表达式

C# 用于更改数组值的Linq表达式,c#,.net,linq,linq-to-sql,lambda,C#,.net,Linq,Linq To Sql,Lambda,我已经用默认值0xFF初始化了一个大小为20的数组,如下所示: Byte[] tempArray = Enumerable.Repeat((Byte)0xFF, 20).ToArray(); 现在,我想将每4个位置的值更改为其他值,例如0xA0 它的Linq表达式应该是什么?您可以使用可枚举的.Range,然后根据索引将索引投影到所需的值: Byte[] tempArray = Enumerable .Range(0, 20) .Select(i => i%4 != 0 ? (B

我已经用默认值
0xFF
初始化了一个大小为
20
的数组,如下所示:

Byte[] tempArray = Enumerable.Repeat((Byte)0xFF, 20).ToArray();
现在,我想将每4个位置的值更改为其他值,例如
0xA0


它的Linq表达式应该是什么?

您可以使用
可枚举的.Range
,然后根据索引将索引投影到所需的值:

Byte[] tempArray = Enumerable
  .Range(0, 20)
  .Select(i => i%4 != 0 ? (Byte) 0xFF : (Byte) 0xA0)
  .ToArray();

LINQ用于访问数据,而不是对其进行修改。如果从20
0xFF
s的数组开始,LINQ不是对其进行更改的合适API

但是,可以使用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;
for(int i=0;i
更好的
.Range(1,20)
,否则第一个字节已计为fourth@TimSchmelter:嗯,这取决于您希望在哪个位置具有值
0xA0
,以及您希望如何编写
i%4=?
表达式。用
Range(1,20)
替换
Range(0,20)
将产生不同的结果。@MartinLiversage您能给我推荐一些地方,让我学习如何编写lambda表达式并更好地使用Linq吗?@ankur:最好的“地方”是stackoverflow。将LINQ添加到您最喜欢的标签中,并关注新问题。试着用你的知识回答这些问题,并从更好的答案中学习。你会惊讶于你学习LINQ的速度有多快。一般来说,回答SO是提高技能的最佳方法。我假设OP不想使用或修改旧数组,而只是简单地询问他可以使用什么查询来获得具有交替值的数组。@TimSchmelter我本来打算提出同样的建议,但OP在标题和问题主体中使用“alter”,表示他可能要修改原始数组。当然很难百分之百确定。@TimSchmelter我更感兴趣的是学习如何编写这样的查询。是否修改原始问题可以稍后处理。谢谢你的帮助。另外,你能推荐一些地方让我学习如何编写lambda表达式并更好地使用Linq吗?@ankur:关键是你永远不应该使用Linq修改现有的集合。您可以创建一个新集合并将其分配给该变量。这可能行得通,但这是一个新的收藏,而且比修改现有的收藏效率低得多。@ankur我通过阅读。这本书使用C#3.5,但它所解释的概念在当前版本的LINQ库中保持不变。