LINQ表达式C#中的条件

本文关键字:条件 表达式 LINQ | 更新日期: 2023-09-27 18:21:12

我是LINQ的初学者。我正试图使用我在Stack Overflow上找到的LINQ表达式创建一个CSV文件:

var sb = new StringBuilder();
var headers = dgvDonnees.Columns.Cast<DataGridViewColumn>();
sb.AppendLine(string.Join(",", headers.Select(column => "'"" + column.HeaderText + "'"").ToArray()));
foreach (DataGridViewRow row in dgvDonnees.Rows)
{
    var cells = row.Cells.Cast<DataGridViewCell>();
    sb.AppendLine(string.Join(",", cells.Select(cell => "'"" + cell.Value + "'"").ToArray()));
}

我想把这个简单的条件添加到foreach循环中:(我在for循环中使用这个条件)

if (Convert.ToInt32(dgvDonnees.Rows[i].Cells[10].Value) == 0) continue;

我希望第10个单元格不为零的行出现在最终CSV中。

我该怎么做?非常感谢。

LINQ表达式C#中的条件

如果你真的想要一个LINQ解决方案,正如你的问题所暗示的那样,你会想要这样做:

foreach (DataGridViewRow row in dgvDonnees.Rows
    .Where(r => Convert.ToInt32(r.Cells[10].Value) != 0))
{
    var cells = row.Cells.Cast<DataGridViewCell>();
    sb.AppendLine(string.Join(",", cells.Select(cell => "'"" + cell.Value + "'"").ToArray()));
}

换句话说,让LINQ为您进行过滤,而不是在循环体中添加额外的语句。它更简洁,也更正确地反映了您正在寻找的语义(即,代码看起来更像您的规范"我想要第10个单元格不为零的行",而在循环中使用continue需要与规范实际内容相反的逻辑表达式)。

只需在foreach循环的开头放一行:

if (Convert.ToInt32(row.Cells[10].Value) == 0) continue;

row替换您的dgDonnees.Rows[i]

最后你会有这个代码:

foreach (DataGridViewRow row in dgvDonnees.Rows)
{
    if (Convert.ToInt32(row.Cells[10].Value) == 0) continue;
    var cells = row.Cells.Cast<DataGridViewCell>();
    sb.AppendLine(string.Join(",", cells.Select(cell => "'"" + cell.Value + "'"").ToArray()));
}