Якщо у мене є список номерів:
1,2,3,4,5,6,7,8
і я хочу замовити за певним номером, а потім показати решту. Наприклад, якщо я вибрав "3", список повинен бути:
3,1,2,4,5,6,7,8
Шукаємо linq та c #. Дякую
Відповіді:
Ви можете використовувати порівняння в OrderBy
або ThenBy
для умовного сортування.
list.OrderByDescending(i => i == 3).ThenBy(i => i);
Я використовую, OrderByDescending
тому що я хочу спочатку збіг результатів ( true
"вище", ніж false
).
myDataList.OrderByDescending(i => i.StringColumnValue[0] == filterStringValue[0]).ToList()
. я використав вашу логіку тут. На основі початкової літери фільтра ці результати відображаються в порядку з тим самим початковим
Кілька відповідей вже сортують останні кілька цифр (що може бути вірним, оскільки ви показуєте лише вже відсортований список). Якщо ви хочете, щоб "невибрані" номери відображались у оригінальному, не обов'язково сортуваному порядку замість сортування, ви можете замість цього зробити;
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 і зберегти порядок усіх інших елементів.
list.OrderBy(i => i != 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);
OrderByDescending
наOrderBy
абоi == 3
наi != 3