2015-11-09 6 views
2

Я начинаю с LINQ. Я пытаюсь создать файл CSV, используя выражение LINQ я нашел на переполнение стека:Условия в выражении LINQ C#

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

Я хочу добавить это простое условие в цикле Еогеасп: (я использую это условие в цикле)

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

Я хочу, чтобы линии, чья ячейка не равна нулю, присутствуют в окончательном CSV.

Как это сделать? Спасибо.

+2

Это довольно простой вариант использования 'Where'. – chris

ответ

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())); 
} 
+1

Я искал это в течение часа и просто так ... возможно, я устал lol Спасибо! – BlackAlpha

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 выполняет фильтрацию вместо вас, вместо добавления дополнительных операторов в тело цикла. Это более красноречиво и правильнее отражает семантику, которую вы ищете (т. Е. Код намного больше похож на вашу спецификацию «Я хочу, чтобы линии, чья ячейка не равна нулю», тогда как использование в цикле continue требует инвертированной логики выражение из того, что на самом деле спецификация).

+0

Да, я адаптировал первый ответ на выражение LINQ. Я использую Resharpher и, по-видимому, «использовать продолжение лучше для гнездования» – BlackAlpha

Смежные вопросы