Linq Спершу замовляйте за певним номером, а потім показуйте всі інші в порядку


78

Якщо у мене є список номерів:

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

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

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

Шукаємо linq та c #. Дякую

Відповіді:


181

Ви можете використовувати порівняння в OrderByабо ThenByдля умовного сортування.

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

Я використовую, OrderByDescendingтому що я хочу спочатку збіг результатів ( true"вище", ніж false).


4
@cracker: змінити OrderByDescendingна OrderByабо i == 3наi != 3
Тім Шмельтер

якщо потрібно відсортувати рядок стовпця myDataList.OrderByDescending(i => i.StringColumnValue[0] == filterStringValue[0]).ToList() . я використав вашу логіку тут. На основі початкової літери фільтра ці результати відображаються в порядку з тим самим початковим
літером

5

Можливо щось подібне:

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.MinValue, цей підхід не спрацює.
Кевін

5

Кілька відповідей вже сортують останні кілька цифр (що може бути вірним, оскільки ви показуєте лише вже відсортований список). Якщо ви хочете, щоб "невибрані" номери відображались у оригінальному, не обов'язково сортуваному порядку замість сортування, ви можете замість цього зробити;

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 і зберегти порядок усіх інших елементів.


1
Ви можете виконати те саме list.OrderBy(i => i != 3).
Дуейн Теріот

2
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);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.