Математическая операция C # datagridview затем передает данные в список

#c# #.net #linq #datagridview #for-loop

#c# #.net #linq #datagridview #для цикла

Вопрос:

У меня есть datagridview в моем графическом интерфейсе Winform, который загружает CSV и собирает данные с тремя столбцами:

File_ID, Подробности, конечная строка
0, sometext,
10, sometext, 3
0, sometext, 5
1, sometext, 9
1, sometext, 16
1, sometext, 23
2, sometext, 25
2, sometext, 27
2, sometext, 28
2, sometext, 30

Я хочу, чтобы это представление сетки было переведено в список, чтобы я мог сделать что-то вроде этого:

pList.Add(новый FileExtract(1, 1, 148165));
pList.Add(новый FileExtract(2, 148165, 166926));

но цикл, а не жесткая запись Add(new FileExtract …)

Список должен выглядеть примерно так:
идентификатор, начало, конец
1, 0, 5
2, 6, 23
3, 24, 30

Обратите внимание, что:
— Для первой строки: ID = 1, start = 0.
— ID = 1 относится к File_ID, считайте ID как счетчик
— Начало с идентификатора 2, конец идентификатора 1 плюс 1, начало с идентификатора 3 = конец идентификатора 2 плюс

Бит, который работает:

                 var filesplitc = from p in ListBoxEdit1
                             group p by p.file_id into grp
                             let MaxP = grp.Max(g => g.RunningTotal)
                             from p in grp
                             where p.RunningTotal == MaxP
                             select p;

            var filesplitc1 = from p in filesplitc
                              select new { file_id = p.file_id, startingline = (p.file_id == 0) ? "0" : "", endingline = p.RunningTotal  };
  

Бит, который не работает:

             var filesplitc2 = from p in filesplitc1
                              select new { 
                                  file_id = p.file_id,
                                  startingline = p.startingline == "" ? ((from x in filesplitc1 where (Convert.ToInt32(x.file_id) <= Convert.ToInt32(p.file_id)) select x.endingline).Last()) : p.startingline,
                                  endingline = p.endingline 
                              };
  

Комментарии:

1. Может быть, вы можете показать некоторый код того, что вы пробовали до сих пор, и где вы застряли с ним.

2. Когда вы говорите бит, который не работает, вы имеете в виду, что он дает неправильные результаты или даже не компилируется? Строка кода IIF, назначающая startingline, выглядит так, как будто это можно сделать с другим набором скобок.

Ответ №1:

Вероятно, вам придется немного его скорректировать, потому что я не знаю, какую структуру данных вы помещаете в список, но она должна дать вам представление. Это не Linq, но попытка объединить все в запрос Linq не обязательно способствует удобочитаемости и обслуживанию кода.

 class FileExtract
{
    public int FileId { get; set; }
    public int Start { get; set; }
    public int End { get; set; }
}


var fileExtracts = new List<FileExtract>();
// take first entry as initializer
var current = new FileExtract 
              { 
                  FileId = ListBoxEdit1.First().file_id, 
                  Start = 0, 
                  End = ListBoxEdit1.First().end_line
              };
int lastEnd = current.End;
// skip first entry of the list as it was already used as initializer
foreach (var p in ListBoxEdit1.Skip())
{
    if (current.FileId != p.file_id)
    {
        current.End = lastEnd;
        fileExtract.Add(current);
        current = new FileExtract { FileId = p.file_id, Start = lastEnd   1, End = p.end_line };          
    }
    lastEnd = p.end_line;
}