Сортировка строк в LINQ

DevOps

Client
Регистрация
30.11.2020
Сообщения
495
Благодарностей
311
Баллы
63
Добрый день форумчане. Никак не могу победить такую вот задачку
Есть строки типа
1| тут строка
2| тут строка
3| тут строка
15| тут строка
29| тут строка
31| тут строка
Хочу при помощи LINQ отсортировать по убыванию

C#:
var result = List.OrderByDescending(n => n).ToList();
List1.AddRange(result);
Но на выходе получается такая вот история
31 | тут строка
3 | тут строка
29 | тут строка
2 | тут строка
15 | тут строка
1| тут строка

Как заставить OrderByDescending делать так
31 | тут строка
29 | тут строка
15 | тут строка
3 | тут строка
2 | тут строка
1| тут строка
Спасибо
 

gelu4

Client
Регистрация
11.01.2015
Сообщения
165
Благодарностей
41
Баллы
28
Попробуй вот так
C#:
var result = List.OrderByDescending(n => int.Parse(n)).ToList();
List1.AddRange(result);
p.s. Хотя если в строке текст, то будет ошибка, чет не подумал сразу
 
  • Спасибо
Реакции: DevOps

DevOps

Client
Регистрация
30.11.2020
Сообщения
495
Благодарностей
311
Баллы
63
Попробуй вот так
C#:
var result = List.OrderByDescending(n => int.Parse(n)).ToList();
List1.AddRange(result);
p.s. Хотя если в строке текст, то будет ошибка, чет не подумал сразу
Спасибо, но не подходит.
Выполнение действия CSharp OwnCode: NW_PROCESSING. Входная строка имела неверный формат.
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 605
Благодарностей
4 596
Баллы
113
Спасибо, но не подходит.
Выполнение действия CSharp OwnCode: NW_PROCESSING. Входная строка имела неверный формат.
C#:
var result = List.OrderByDescending(n => int.Parse(n.Split('|')[0])).ToList();
List1.AddRange(result);
 
  • Спасибо
Реакции: DevOps

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 760
Благодарностей
2 398
Баллы
113
C#:
List<string> list_in = new List<string>(){ "11", "11", "22", "22","22", "333","333","333","333"};
List<string> list_out = new List<string>();

// Выборка данных "ленивым способом"
IEnumerable<string> query = list_in.GroupBy(x => x)
    .Where(g => g.Count() > 1)
    .Select(y => string.Join("|", new []{ y.Key, y.Count().ToString()}));

// ==> можно удалить
project.SendInfoToLog("Было: ");
query.ToList().ForEach(q=>project.SendInfoToLog(q)); // Материализуем результат для вывода в лог
//  можно удалить ===<

// Сортируем данных "ленивым способом"
IEnumerable<string> query2 = query.OrderByDescending(x=> int.Parse(x.Split('|')[1]));

// ==> можно удалить
project.SendInfoToLog("Стало: ");
query2.ToList().ForEach(x=>project.SendInfoToLog(x));  // Материализуем результат для вывода в лог
//  можно удалить ===<

list_out.AddRange(query2.ToList());
Но, если дело обстоит именно так, тогда есть смысл в общем коде создать новый класс, и уже сразу получать оттуда нужные данные.
Фишка в том, чтобы не переводить в число, соединять, потом разбивать обратно и тп.

например:
C#:
public class Line {
        public int Count;
        public string Text;
        public Line(int count, string text){
            Count = count;
            Text = text;
        }
    }
C#:
List<string> list_in = new List<string>(){ "11", "11", "22", "22","22", "333","333","333","333"};
List<string> list_out1 = new List<string>();
List<string> list_out2 = new List<string>();

IEnumerable<Line> query = list_in.GroupBy(x => x)
    .Where(g => g.Count() > 1)
    .Select(y => new Line(y.Count(), y.Key))
    .OrderByDescending(x=> x.Count);

list_out1.AddRange(query.Select(x=>string.Format("{0}|{1}", x.Count, x.Text)).ToList());
list_out2.AddRange(query.Select(x=>x.Text).ToList());

project.SendInfoToLog("========= list_out1 ========");
list_out1.ForEach(x=>project.SendInfoToLog(x));

project.SendInfoToLog("========= list_out2 ========");
list_out2.ForEach(x=>project.SendInfoToLog(x));
80729
 
  • Спасибо
Реакции: Alexmd и DevOps

DevOps

Client
Регистрация
30.11.2020
Сообщения
495
Благодарностей
311
Баллы
63
C#:
List<string> list_in = new List<string>(){ "11", "11", "22", "22","22", "333","333","333","333"};
List<string> list_out = new List<string>();

// Выборка данных "ленивым способом"
IEnumerable<string> query = list_in.GroupBy(x => x)
    .Where(g => g.Count() > 1)
    .Select(y => string.Join("|", new []{ y.Key, y.Count().ToString()}));

// ==> можно удалить
project.SendInfoToLog("Было: ");
query.ToList().ForEach(q=>project.SendInfoToLog(q)); // Материализуем результат для вывода в лог
//  можно удалить ===<

// Сортируем данных "ленивым способом"
IEnumerable<string> query2 = query.OrderByDescending(x=> int.Parse(x.Split('|')[1]));

// ==> можно удалить
project.SendInfoToLog("Стало: ");
query2.ToList().ForEach(x=>project.SendInfoToLog(x));  // Материализуем результат для вывода в лог
//  можно удалить ===<

list_out.AddRange(query2.ToList());
Но, если дело обстоит именно так, тогда есть смысл в общем коде создать новый класс, и уже сразу получать оттуда нужные данные.
Фишка в том, чтобы не переводить в число, соединять, потом разбивать обратно и тп.

например:
C#:
public class Line {
        public int Count;
        public string Text;
        public Line(int count, string text){
            Count = count;
            Text = text;
        }
    }
C#:
List<string> list_in = new List<string>(){ "11", "11", "22", "22","22", "333","333","333","333"};
List<string> list_out1 = new List<string>();
List<string> list_out2 = new List<string>();

IEnumerable<Line> query = list_in.GroupBy(x => x)
    .Where(g => g.Count() > 1)
    .Select(y => new Line(y.Count(), y.Key))
    .OrderByDescending(x=> x.Count);

list_out1.AddRange(query.Select(x=>string.Format("{0}|{1}", x.Count, x.Text)).ToList());
list_out2.AddRange(query.Select(x=>x.Text).ToList());

project.SendInfoToLog("========= list_out1 ========");
list_out1.ForEach(x=>project.SendInfoToLog(x));

project.SendInfoToLog("========= list_out2 ========");
list_out2.ForEach(x=>project.SendInfoToLog(x));
Посмотреть вложение 80729
Спасибо. LINQ действительно одна из мощнейших технологий.
У Вас просто суперскилы в .NET :-)
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)