使用LINQ迭代数组并使用每个位置的值

时间:2018-05-08 12:42:44

标签: c# .net winforms linq

我正在使用.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循环?

2 个答案:

答案 0 :(得分: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。我会坚持现有的实施。

答案 1 :(得分:-1)

当您使用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(项目中的项目)中,您无法更改值“item”。这一点非常精细,但下面的评论者是正确的,以上可能会产生误导。

相关问题