OrderBy не сортирует

150
13 февраля 2019, 05:20

Есть следующий код

class TestSlot
{
    public double? Price;
}
static void Main(string[] args)
{
    var slots = new List<TestSlot>();
    var slot = new TestSlot();
    for (var i = 0; i < 5; i++)
    {
        slot = new TestSlot();
        slot.Price = 5 - i;
        slots.Append(slot);
    }
    /*
    slot = new TestSlot();
    slot.Price = null;
    slots.Append(slot);
    */
    var k = slots.OrderBy(x => x.Price).ToList();
    foreach (var z in k)
    {
        Console.WriteLine(z);
    }
}

Почему k.Count() == 0?

Так как я не могу запустить данный код, то не могу ответить на вопрос, который я задал себе изначально? Что будет, если пихнуть в slots объект с Price == null? (в коде эта часть закоменчена)

Answer 1

У коллекции List<> нет метода Append(): документация

Если вы нажмете F12 на этом методе в студии, то увидите, что вы на самом деле вызываете метод Enumerable.Append из Linq (доступно с 4.7.1): документация

Этот метод (как и любые методы Linq) не изменяет входную коллекцию — он возвращает новую последовательность, которую вы потом просто никуда не сохраняете.

Для добавления элемента в List воспользуйтесь его методом Add.

PS: Можно, конечно, написать slots = slots.Append(slot).ToList();, но это неэффективно — список будет пересоздаваться каждый раз заново.

Что касается второй части вопроса: т. к. при вызове OrderBy вы не передаете экземпляр IComparer<T>, то для сравнения будет использоваться Comparer<T>.Default, который, в свою очередь, для Nullable<>-типов создает специальный NullableComparer<T>. Если посмотреть реализацию NullableComparer<T>.Compare(), то вы увидите, что значения null в нем считаются меньшими любого не-null, поэтому при сортировке они будут помещены в самое начало списка.

READ ALSO
Как сделать авторизацию по имени в .net core 2.1?

Как сделать авторизацию по имени в .net core 2.1?

делаю чат и параллельно учуnet core 2

135
Async/await в DataLayer - потерял преимущества

Async/await в DataLayer - потерял преимущества

В небольшом приложении получаю данные из SQL во ViewModel напрямую через SqlCommandExecuteReaderAsync() и SqlDataReader

153
Аргументы метода LINQ select

Аргументы метода LINQ select

Не понимаю, почему такЕсть вызов асинхронного метода

147
DataRowExtensions.SetField vs индексатор

DataRowExtensions.SetField vs индексатор

Есть ли какая-то разница между присваиванием нового значение DataRow через DataRowExtensionsSetField и через индексатор по имени?

123