【问题标题】:Linq: List all Rows in DataGridView that contain at least 2 cells with a ValueLinq:列出 DataGridView 中包含至少 2 个具有值的单元格的所有行
【发布时间】:2021-09-29 19:28:13
【问题描述】:

我想过滤 DataGridView 中包含至少两个具有特定值但从第三列开始的单元格的所有行。

我有什么:

var filteredRows = new List<DataGridViewRow>();
foreach (DataGridViewRow row in myDataGridView.Rows) {
    if (row.Cells.Cast<DataGridViewCell>().Where(x => x.ColumnIndex > 1 && x.Value != null && (int)x.Value == 10).Count() >= 2) {
        filteredRows.Add(row);
    }
}

我想在 Linq 语法中使用全部内容。

感谢您的想法!

【问题讨论】:

  • 您有什么问题?
  • 无。上面的行工作正常。我只是想学习如何使用 Linq 处理整个事情(如果可能的话)。

标签: c# linq


【解决方案1】:

你可以使用LINQ的SelectMany:

myDataGridView.Rows.SelectMany(row => row.Cells.Cast<DataGridViewCell>().Where(x => x.ColumnIndex > 1 && x.Value != null && (int)x.Value == 10).Count() >= 2))

【讨论】:

  • 谢谢您的回答!不幸的是,这不适用于 .NET 4.5。 myDataGridView.Rows 不知道 SelectMany()。我什至尝试了 myDataGridView.Rows.Cast().SelectMany(...) 但后来我收到错误:方法'System.Linq.Enumerable.SelectMany(System.Collections. Generic.IEnumerable, System.Func>)' 无法从用法中推断出来。尝试明确指定类型参数。
  • 该错误意味着您需要在 SelectMany 之后指定泛型参数,这可能是 &lt;DataGridViewCell, DataGridViewCell&gt;,因为您的集合类型和结果类型都是相同的。
【解决方案2】:

你可以用 where 代替 if

myDataGridView.Rows
  .where(row => row.Cells.Cast<DataGridViewCell>()
               .Count(x => 
                            x.ColumnIndex > 1 &&
                            x.Value != null &&
                            (int)x.Value ==10) >= 2
        ).ToList();

【讨论】:

    猜你喜欢
    • 2019-05-13
    • 2012-01-31
    • 2022-06-22
    • 1970-01-01
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多