使用LINQ删除ControlCollection中每个控件的DatagridView中的第一列

时间:2015-03-10 03:09:49

标签: c# winforms linq datagridview

因此,非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查询可以做些什么呢?

1 个答案:

答案 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仅用于算法的查询部分,并坚持使用传统的命令式语义。