因此,非LINQ方式将是这样的:
foreach(Control cont in panel1.Controls)
{
if (cont is DataGridView)
{
var grid = cont as DataGridView;
grid.Columns.RemoveAt(0);
}
}
我在Linq尝试过这样做。它更适合学习体验,而不是专门做最好的方式。无论如何,这是我到目前为止的地方,但它显然不起作用。
panel1.Controls = panel1.Controls
.AsParallel()
.OfType<DataGridView>()
.Select(grid => grid.Columns
.OfType<DataGridViewColumn>()
.Skip(1));
那么修改linq查询可以做些什么呢?
答案 0 :(得分:2)
您提出的解决方案使用AsParallel()
没有明确原因,并且无法实际删除列。
LINQ实际上是用于查询事物,而不是修改它们。为什么要在这里使用LINQ解决方案?你已经拥有的循环出了什么问题?
可以编写一个可以执行所需操作的LINQ表达式,但该表达式要么您需要编写显式foreach
循环,要么将枚举实现为实际对象,只是为了获取表达式执行。该表达式还需要返回一些值,以保留LINQ的查询语义,即使您的操作本身并不涉及返回值。
例如,您可以写:
panel1.Controls.OfType<DataGridView>().Select(
grid => { grid.Columns.RemoveAt(0); return null; }).ToList();
但那段代码对我来说似乎相当丑陋。它正在创建一个你永远不会使用的全新List<T>
对象,其中包含一堆null
值。
如果您想清理原始代码,我会执行以下操作:
foreach (DataGridView grid in panel1.Controls.OfType<DataGridView>())
{
grid.Columns.RemoveAt(0);
}
在那里,您正在使用LINQ仅用于算法的查询部分,并坚持使用传统的命令式语义。