2013-04-08 100 views
2

我對從名爲Person的對象列表擴展而來的Class(PersonCollection)使用linq操作。擴展列表類中的linq操作

public class PersonCollection: List<Person> 
{ 
      //various functions 
} 

public class Person 
{ 
      public string name{ get; set; } 
      public string address { get; set; } 
} 

本來我是用字符串列表名單來存儲這個類是由和LINQ操作將工作

List<List<String>> oldList = GetList(); 

    oldList = (List<List<string>>)oldList .OrderBy(s =>s[index_of_name]).ToList(); 

這會工作,但我顯然想擺脫數據使用究竟是什麼概念證明基本上是簡單的代碼

應用於這些新類的同一類型的LINQ操作不起作用:

people = (PersonCollection)orderedData.OrderBy(s => s.name]).ToList(); 

這是錯誤我得到:

Unable to cast object of type 'System.Collections.Generic.List`1[Person]' to type 'PersonCollection'. 

如果我投列出它的工作原理,就是用現在

people = (List<Person>)people .OrderBy(s => s.name]).ToList(); 

我想用我的PersonCollection類從擴展什麼IM一個人名單,我的方法在哪裏出錯?無論是編碼還是數據分類的一般選擇

+2

只是好奇,爲什麼你必須直接從列表繼承? – 2013-04-08 11:38:59

+0

或者爲什麼你需要一個集合(因此) - 當從'IEnumerable <>'抽取'到集合時 - 通常是這樣 - 你只是用它來枚舉。如果你發佈更多的代碼,我們可以幫助更多 – NSGaga 2013-04-08 12:44:09

+0

@CongLong這個想法是靈活性:它是一個類的人在列表中執行操作,所以我想我會擴大名單,這樣我可以添加一些功能,這個類,並在需要時將linq操作應用到別處的類對象。此刻,考慮到我不得不投入人員名單,無論如何,我可能只是稍微拆散課堂,並將其設置爲靜態或將人員職能作爲靜態函數放置 – fullface 2013-04-09 08:16:58

回答

5

您的PersonCollectionList<Person>,但不是相反。

因此,您不能將List<Person>轉換爲PersonCollection。你必須創建類型的新對象PersonCollection

你可以用一個構造函數做到這一點:

public class PersonCollection : List<Person> 
{ 
    public PersonCollection(List<Person> list) 
    : base(list) 
    { 
    } 
} 

然後你可以從List<Person>

List<Person> list = people.OrderBy(s => s.name]).ToList(); 

PersonCollection pc = new PersonCollection(list); 
+0

這是我沒有嘗試過的,但本質上是與我的最後一塊代碼相同,但帶有構造函數以導入到PersonCollection.Does我嘗試將其轉換爲PersonCollection時出現錯誤,這意味着我錯誤地嘗試這樣做?如果是這樣,我會恢復到一個人類,也許與靜態函數處理列表操作...... – fullface 2013-04-08 15:53:18

1

構建PersonCollection作爲附錄尼古拉斯'回答,我會建議創建一個自定義擴展方法以允許更短的語法:

public static class MyListExtensions { 
    public static PersonCollection ToPersonCollection(this IEnumerable<Person> list) { 
     return new PersonCollection(list.ToList()); 
    } 
} 

作爲一個附註,我會建議重新考慮一下你的術語:你的PersonCollection真的只是代表Collection還是真的List。這可能確實看起來很迂腐,但爲了讓您的代碼更具可讀性,通常有必要精確地指定。

+1

或只是'新的PersonCollection(列表) - OP可以從IEnumerable構造,他不需要列表。 – NSGaga 2013-04-08 12:42:37