Заказать LINQ на основе определенного числа первых, то показывают все остальное в порядке


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

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

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

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

Ищу linq и c#. Спасибо

4   51   2012-03-30 01:34:28

4 ответа:

list.OrderByDescending(i => i == 3).ThenBy(i => i);

может, что-то вроде этого:

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));

несколько ответов уже сортируют последние несколько чисел (что может быть правильно, так как вы показываете только уже отсортированный список). Если вы хотите, чтобы" невыбранные " номера отображались в их оригинал, не обязательно отсортированы порядок вместо сортировки, вы можете вместо этого сделать;

int num = 3;
var result = list.Where(x => x == num).Concat(list.Where(x => x != num));

Как указывает @DuaneTheriot,метод расширения IEnumerable OrderBy выполняет стабильную сортировку и не изменяет порядок элементов, имеющих одинаковый ключ. В других слова;

var result = list.OrderBy(x => x != 3);

работает так же хорошо, чтобы сначала отсортировать 3 и сохранить порядок всех других элементов.

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);