Linq Закажите по определенному номеру сначала, затем покажите все остальное по порядку
Если у меня есть список чисел:
1,2,3,4,5,6,7,8
и я хочу заказать по определенному номеру, а затем показать остальные.
Например, если я выбрал "3", список должен быть:
3,1,2,4,5,6,7,8
Ищем linq и С#.
Спасибо вам
Ответ 1
Вы можете использовать сравнение в OrderBy или ThenBy для выполнения условной сортировки.
list.OrderByDescending(i => i == 3).ThenBy(i => i);
Я использую OrderByDescending потому что я хочу сначала сопоставить результаты (true "выше", чем false).
Ответ 2
Возможно, что-то вроде этого:
List<int> ls=new List<int>{1,2,3,4,5,6,7,8};
int nbr=3;
var result= ls.OrderBy (l =>(l==nbr?int.MinValue:l));
Ответ 3
Несколько ответов уже сортируют последние несколько номеров (что может быть правильным, поскольку вы показываете уже отсортированный список). Если вы хотите, чтобы "невыделенные" номера отображались в исходном, необязательно отсортированном порядке вместо сортировки, вы можете вместо этого сделать:
int num = 3;
var result = list.Where(x => x == num).Concat(list.Where(x => x != num));
Как указывает @DuaneTheriot, Метод IEnumerable extension OrderBy делает стабильный сортировку и не изменяет порядок элементов, имеющих одинаковый ключ, Другими словами:
var result = list.OrderBy(x => x != 3);
работает так же, как сначала сортировать 3 и сохранять порядок всех остальных элементов.
Ответ 4
public static IEnumerable<T> TakeAndOrder<T>(this IEnumerable<T> items, Func<T, bool> f)
{
foreach ( var item in items.Where(f))
yield return item;
foreach (var item in items.Where(i=>!f(i)).OrderBy(i=>i))
yield return item;
}
var items = new [] {1, 4, 2, 5, 3};
items.TakeAndOrder(i=> i == 4);