2009-10-23 1 views
1

Вот мои настройки.C# Список <T> OrderBy всегда возвращает null

public class ItemList : List<Item> 
{ 
    public void Load() {...} 
    public void Save() {...} 
} 

нагрузки считывает из файла XML для заполнения ITEMLIST

Я затем попытаться заказать список элементов по приоритету. Это int? Однако для целей тестирования все элементы имеют другое значение.

ItemList itemList = new ItemList(); 
itemList.Load(); 

ItemList newItemList = itemList 
         .OrderBy(item => item.Priority) as ItemList; 

return newItemList; 

В вышеприведенном newItemList всегда имеет значение null. itemList имеет значение 7. Я проверил трижды, и все элементы экземпляра itemList имеют приоритет.

Что я делаю неправильно?

Я также попытался ...

ItemList newItemList = itemList 
         .OrderBy(item => item.Priority) 
         .ToList() as ItemList; 

Ничто, кажется, работает.

Заранее благодарен!

ответ

2

Ни OrderBy, ни ToList не возвращает ItemList, поэтому кастинг возвращает значение null, как указал Джозеф.

Как вы унаследовав от List<T> класса, вы можете просто использовать метод сортировки для сортировки:

ItemList itemList = new ItemList(); 
itemList.Load(); 
itemList.Sort((x, y) => x.Priority.CompareTo(y.Priority)); 
return itemList; 
+0

Я стараюсь избегать использования Сортировки, потому что, если я не ошибаюсь, что я часто бываю, для этого нужно построить методы CompareTo для всего, что я хочу сортировать. – Altonymous

+0

BTW. Когда я пытаюсь использовать это решение, CompareTo не является допустимым методом Off Priority. Приоритет - это int? – Altonymous

+0

Понял, я думаю! itemList.Sort ((x, y) => x.Priority.HasValue.CompareTo (y.Priority)); – Altonymous

7

Проблема заключается в том, что OrderBy не возвращает ItemList, он возвращает IOrderedEnumerable, а ToList() не возвращает ItemList, он возвращает список. В любом случае, вы пытаетесь применить оба к элементу ItemList, а это не так, и вы получите null.

ItemList someList = (new ItemList {new Item(2), new Item(1), new Item(3)}); 

//this returns an IOrderedEnumerable<Item> 
var result = someList.OrderBy(i => i.Priority); 

//this returns a List<Item> 
var otherResult = someList.ToList(); 
+0

Спасибо за объяснение теперь я просто должен выяснить, как использовать OrderBy и в конечном итоге список предметов. Я не хочу использовать Сортировку, потому что я не хочу создавать методы CompareTo для всего. Когда я пытаюсь использовать нижеприведенное решение, которое использует Sort CompareTo, это не допустимый метод с приоритетом, а Priority - int? – Altonymous

+0

Получил это, я думаю! itemList.Sort ((x, y) => x.Priority.HasValue.CompareTo (y.Priority)); – Altonymous

+0

Не ответ .. не думал об этом ... Когда я использую HasValue, он пытается сравнить результат HasValue, который является bool, приоритету. Все еще работает над этим! – Altonymous

0

Я думаю, что ваша проблема - это «как элемент списка».

+0

Это не сработает, поскольку результат не может быть перенесен в ItemList. –

+0

Хорошая точка. Я не принимал во внимание необходимость обновить список до типа ItemList. – CodingWithSpike

0

Операторы LINQ не работают на месте вашего объекта newItemList. Они создают и возвращают новые объекты. Если вы хотите выполнить сортировку на месте, вы должны использовать метод Sort() списка <>.