Получить список на основе содержащей строки, затем упорядочить его по тем же числовым значениям в списке

#c# #list #linq

#c# #Список #linq

Вопрос:

Я заполнил список lstLines несколькими строками.

Например, в списке есть несколько строк, как в:

  1. В столбце SName листа [Sheet1] отсутствует значение ячейки в строке 6.
  2. В столбце SName листа [Sheet1] отсутствует значение ячейки в строке 9.
  3. FName столбца листа [Sheet1] имеет отсутствующее значение ячейки в строке 6.
  4. FName столбца листа [Sheet1] имеет отсутствующее значение ячейки в строке 11.
  5. Столбец DOB листа [Sheet1] имеет отсутствующее значение ячейки в строке 6.
  6. FName столбца листа [Класс 4] имеет отсутствующее значение ячейки в строке 1.
  7. Столбец DOB листа [Класс 4] имеет отсутствующее значение ячейки в строке 3.
  8. Столбец DOB листа [Класс 4] имеет отсутствующее значение ячейки в строке 4.

Теперь на основе [Sheet1] и [Grade 4] создайте отдельный список. Я сделал это.

Но я не могу упорядочить разделенный список на основе значений строки(они находятся в конце каждой строки).

Например, строки [Лист 1] должны располагаться по возрастанию в соответствии со значениями строк (6, 9, 6, 11, 6, 6).

 foreach (var item in _lstErrorSheets)
{
    var newlist = (from s in _lstLines where s.Contains(item) select s).ToList();
               foreach (var error in newlist)
               {
                    rtbDisplay.AppendText(lineNum  ". " error   " rn");
                    lineNum  ;
               }
}
  

Ответ №1:

Если я чего-то не упускаю, это можно сделать с помощью одной строки:

 var result = lstLines
    .Where(l => l.Contains("[Sheet1]"))
    .OrderBy(l => int.Parse(l.Substring(l.IndexOf("row")   4).TrimEnd('.')));
  

Разбивка:
Используйте Where для фильтрации списка и OrderBy для его сортировки.

Вы хотите выполнить сортировку по числовому значению строки, поэтому вам нужно использовать substring для выделения номера строки точкой в конце каждой строки, а затем trimEnd удалить точку и, наконец, int.Parse получить число, иначе 11 оно будет стоять перед 6 или 9 .