2009-10-23 6 views
1

여기에 제 설정이 있습니다.C# List <T> OrderBy는 항상 null을 반환합니다.

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

로드는 ITEMLIST

내가 다음 우선 순위에 의해 항목 목록을 주문하려고

을 채우는 XML 파일에서 읽습니다. 이건 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를 반환하지 않으므로 Joseph이 지적한대로 캐스팅은 null을 반환합니다. 당신이 List<T> 클래스에서 상속되기 때문에

, 당신은 단지 그것을 정렬 정렬 방법을 사용할 수 있습니다 :

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

내가 자주 사용하지 않는다면 Sort를 사용하지 않는 것이 좋습니다. 왜냐하면 내가 자주 사용하기 때문에 정렬하고자하는 모든 항목에 대해 CompareTo 메소드를 구현해야하기 때문입니다. – Altonymous

+0

BTW,이 솔루션을 사용해 볼 때 CompareTo가 Priority 이외의 유효한 메서드가 아닙니다. 우선 순위가 int입니까? – Altonymous

+0

알았어! itemList.Sort ((x, y) => x.Priority.HasValue.CompareTo (y.Priority)); – Altonymous

7

문제는 OrderBy가 ItemList를 반환하지 않고 IOrderedEnumerable을 반환하고 ToList()가 ItemList를 반환하지 않으면 List를 반환한다는 것입니다. 어느 쪽이든, 둘 다 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를 사용하고 끝낼 방법을 파악해야 ItemList. SortTo를 사용하고 싶지 않습니다. 왜냐하면 모든 것에 대해 CompareTo 메서드를 작성하고 싶지 않기 때문입니다. SortTo를 사용하는 아래 솔루션을 사용하려고 할 때 유효한 방법이 아닌 우선 순위이며 우선 순위가 int입니까? – Altonymous

+0

알았어! itemList.Sort ((x, y) => x.Priority.HasValue.CompareTo (y.Priority)); – Altonymous

+0

대답은 .. 그것을 통해 생각하지 못했습니다 ... HasValue를 사용할 때 bool 인 HasValue의 결과를 우선 순위와 비교하려고합니다. 아직 작업 중입니다. – Altonymous

0

"as ItemList"라고 생각합니다.

+0

결과가 ItemList에 캐스트 될 수 없으므로이 방법도 작동하지 않습니다. –

+0

좋은 지적. 나는 목록을 ItemList 유형으로 업 캐스팅해야 할 필요성을 고려하지 않았다. – CodingWithSpike

0

LINQ 연산자는 newItemList 개체에서 현재 위치에서 작동하지 않습니다. 그들은 새로운 객체를 생성하고 반환합니다. 전체 정렬을 수행하려면 List <>의 Sort() 메서드를 사용해야합니다.

관련 문제