Linq сначала по определенному номеру, потом покажи все остальные по порядку - PullRequest
67 голосов
/ 30 марта 2012

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

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

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

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

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

Ответы [ 4 ]

141 голосов
/ 30 марта 2012

Вы можете использовать сравнение в OrderBy или ThenBy для выполнения условной сортировки.

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

Я использую OrderByDescending, потому что сначала я хочу сопоставить результаты (true "выше", чем false).

5 голосов
/ 30 марта 2012

Может быть, что-то вроде этого:

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 голосов
/ 30 марта 2012

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

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

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

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

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

2 голосов
/ 30 марта 2012
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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...