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

  • Автор темы Автор темы DevOps
  • Дата начала Дата начала

DevOps

Client
Регистрация
30.11.2020
Сообщения
497
Реакции
316
Баллы
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| тут строка
Спасибо
 
Попробуй вот так
C#:
Развернуть Свернуть Копировать
var result = List.OrderByDescending(n => int.Parse(n)).ToList();
List1.AddRange(result);

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

p.s. Хотя если в строке текст, то будет ошибка, чет не подумал сразу
Спасибо, но не подходит.
Выполнение действия CSharp OwnCode: NW_PROCESSING. Входная строка имела неверный формат.
 
Спасибо, но не подходит.
Выполнение действия CSharp OwnCode: NW_PROCESSING. Входная строка имела неверный формат.
C#:
Развернуть Свернуть Копировать
var result = List.OrderByDescending(n => int.Parse(n.Split('|')[0])).ToList();
List1.AddRange(result);
 
  • Оценить
Реакции: DevOps
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
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 :)
 

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