我正在使用.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循环?
答案 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的链接帖子比我更好地谈论它
编辑* 请注意,上面对值的引用具体指的是您正在迭代的容器。只要您不想更改容器,就可以更改“值”,这意味着在foreach(项目中的项目)中,您无法更改值“item”。这一点非常精细,但下面的评论者是正确的,以上可能会产生误导。