#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;
}