【问题标题】:Iterate over array with LINQ and use the value at each position使用 LINQ 遍历数组并使用每个位置的值
【发布时间】:2018-05-08 12:42:44
【问题描述】:

我正在使用 .NET 4.6.1

我有一个属性,我可以使用它来获取和设置DataGridView 中每一列的宽度:

public int[] MyDataGridViewColWidth
{
    get
    {
        return myDataGridView.Columns.Cast<DataGridViewColumn>().Select(c => c.Width).ToArray();
    }
    set
    {
        for (int pos = 0; pos < value.Length; pos++)
        {
            myDataGridView.Columns[pos].Width = value[pos];
        }
    }
}

如您所见,getter 使用 LINQ 表达式来检索数组中的所有列宽。

setter 中的反转是否也适用于 LINQ,还是我应该坚持原始 for 循环?

【问题讨论】:

  • 循环中的原语是什么?每当你想修改多个东西时使用它。 LINQ 查询不应引起副作用。它应该只用于查询和返回一些东西。
  • LINQ 仅用于在内部编写小代码,一旦它编译完所有相同的东西。
  • 我会坚持使用for 循环。认为您可能想在 set 中为 null 和比列数长的 array 添加一些检查。
  • @RICKYKUMAR:OP 正在询问 set 访问器。没有 LINQ 等价物可以编译成相同的东西。有一个很好的理由:LIN(Q) 查询源并且不修改它们。
  • 是的,您可以在 setter 中使用 LINQ,但我会坚持使用您现在拥有的解决方案。如前所述,您可能需要添加一些错误检查。

标签: c# .net winforms linq


【解决方案1】:

从技术上讲,这里可以使用 LINQ

set
{
    value.Select((i, pos) => myDataGridView.Columns[pos].Width = i).Last();
}

Last() 强制枚举整个序列。该序列由赋值表达式myDataGridView.Columns[pos].Width = i 产生的值组成。这些值被忽略,因为在这种情况下只有副作用(更改 myDataGridView.Columns[pos].Width)很重要

然而for 经常在简单性和可移植性方面对它们进行规则[LINQ 扩展]。 LINQ 并不意味着产生副作用。它是 .NET 特定的,在 .NET 之外必须使用 for。我会坚持现有的实现。

【讨论】:

    【解决方案2】:

    当您使用 LINQ 或 ForEach 循环时,它们都依赖于 IEnumerable,您不应该在循环期间修改您正在迭代的容器。如果要更改值,则需要使用 for 循环。来自 MSDN 的链接帖子比我能更好地谈论它

    https://social.msdn.microsoft.com/Forums/vstudio/en-US/a90c87be-9553-4d48-9892-d482ee325f02/why-cant-change-value-in-foreach?forum=csharpgeneral

    编辑* 请注意,上面对值的引用专门指的是您正在迭代的容器。只要您不尝试更改容器,就可以更改“值”,这意味着在 foreach(项目中的项目)中您无法更改值“项目”。这一点很细化,但下面的评论是正确的,上面可能会产生误导。

    【讨论】:

    • 您可以在枚举期间修改foreach-loop 中的值。您只是无法更改项目的来源(例如,从您正在枚举的集合中添加或删除项目)。 foreach-loop 是修改项目的完美工具,而 LINQ 查询则不是。
    • 您的回答具有误导性。您可以在循环中修改值,而不是正在循环的数据。
    • 大多数在这里提出问题的人对 C# 来说都是相当陌生的......在某些时候,我们必须平衡新开发人员的精度和可读性。现实情况是线程的答案是使用索引直接访问和使用枚举器之间的区别,这对于新开发人员来说不是一个简单的概念。该链接很好地描述了这一点,但试图通过使用精确的语言来区分这一点会失去人们。对于那些与普查员共事多年的人来说,这种区别可能并不复杂,但对某些人来说却很复杂。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 2016-08-19
    • 2017-09-30
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    相关资源
    最近更新 更多