Есть следующий код
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? (в коде эта часть закоменчена)
У коллекции 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
, поэтому при сортировке они будут помещены в самое начало списка.
В небольшом приложении получаю данные из SQL во ViewModel напрямую через SqlCommandExecuteReaderAsync() и SqlDataReader
Есть ли какая-то разница между присваиванием нового значение DataRow через DataRowExtensionsSetField и через индексатор по имени?