我是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个单元格不为零的行。
我该怎么做?谢谢。
答案 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()));
}