【问题标题】:Linq expression for altering array values用于更改数组值的 Linq 表达式
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

    • 更好.Range(1, 20),否则第一个字节已经算第四个了
    • @TimSchmelter:嗯,这取决于您希望在哪些位置获得 0xA0 的值以及您喜欢如何编写 i%4 = ? 表达式。将Range(0, 20) 替换为Range(1, 20) 会产生不同的结果。
    • @MartinLiversage 你能推荐一个我可以学习如何编写 lambda 表达式并更好地使用 Linq 的地方吗?
    • @ankur:最好的“地方”是stackoverflow。将 LINQ 添加到您最喜欢的标签并关注新问题。尝试用您的知识回答它们,并从更好的答案中学习。你会惊讶于你学习 LINQ 的速度有多快。一般来说,回答 SO 是提高技能的最佳方式。
    【解决方案2】:

    LINQ 旨在访问数据,而不是对其进行修改。如果您从 20 个 0xFFs 的数组开始,则 LINQ 不适合对其进行更改。

    但是,您可以使用 LINQ 在旧数组的基础上构造一个新数组:

    var res = tempArray.Select((v, i) => i % 4 != 0 ? v : (Byte)0xA0).ToArray();
    

    这会生成一个全新的数组,而不是在原地更改 tempArray。您可以将res 复制到tempArray,或者如果您想更改tempArray,请进行分配。

    【讨论】:

    • 我假设 OP 不想使用或修改旧数组,而只是询问他可以使用什么查询来获取具有交替值的数组。
    • @TimSchmelter 我最初打算提出同样的建议,但 OP 在标题和问题正文中都使用了“alter”,这表明他可能想要对原始数组。当然,很难 100% 确定。
    • @TimSchmelter 我对学习如何编写这样的查询更感兴趣。是否修改原始问题可以稍后处理。谢谢您的帮助。另外,你能推荐一个我可以学习如何编写 lambda 表达式并更好地使用 Linq 的地方吗?
    • @ankur:关键是你永远不应该使用 LINQ 来修改现有的集合。您可以创建一个新集合并将其分配给该变量。这可能行得通,但它是一个新集合,而且效率通常低于修改现有集合。
    • @ankur 我通过阅读pocket reference 学习了 LINQ。本书使用 C# 3.5,但它解释的概念在当前版本的 LINQ 库中保持不变。
    【解决方案3】:
    tempArray = tempArray.Select((b, i) => i % 4 == 0 ? (byte)0xA0 : b).ToArray();
    

    【讨论】:

      【解决方案4】:

      如果你真的想创建一个具有交替值的新数组,你已经有了很好的工作答案。

      但是没有人展示修改现有数组的常规方法是使用 for 循环:

      for (int i = 0; i < tempArray.Length; i++)
          if ((i + 1) % 4 == 0)
              tempArray[i] = 0xA0;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多