LINQ表达式中的条件C#

时间:2015-11-09 21:29:32

标签: c# linq csv

我是LINQ的初学者。我尝试使用Stack Overflow上的LINQ Expression创建一个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;

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

我该怎么做?谢谢。

2 个答案:

答案 0 :(得分:3)

如果你真的想要一个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为您进行过滤,而不是向循环体添加额外的语句。它更简洁,更正确地反映了您正在寻找的语义(即代码看起来更像您的规范&#34;我想要第10个单元格不为零的行&#34; < / em>,而在循环中使用continue需要一个与规范实际相同的反向逻辑表达式。)

答案 1 :(得分:0)

只需将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()));
}