Подтвердить что ты не робот

Linq Закажите по определенному номеру сначала, затем покажите все остальное по порядку

Если у меня есть список чисел:

1,2,3,4,5,6,7,8

и я хочу заказать по определенному номеру, а затем показать остальные. Например, если я выбрал "3", список должен быть:

3,1,2,4,5,6,7,8

Ищем linq и С#. Спасибо вам

4b9b3361

Ответ 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);