2013-04-08 5 views
2

Я использую операции linq для класса (PersonCollection), который расширен из списка объектов, называемых Person.Операции 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 простиралась от Список людей, где я ошибаюсь в своем подходе? будь то в кодировании или общем выборе того, как данные классифицируются

+2

Просто интересно, почему вы должны наследовать непосредственно из списка ? –

+0

Или почему вам нужна коллекция (в результате) - часто так, когда «перекачка» из «IEnumerable <>» в коллекцию - вы просто используете ее для перечисления. Если вы разместите больше кода, мы сможем помочь больше – NSGaga

+0

@CuongLe Идея была гибкой: ну это класс, который выполняет операции над списком людей, поэтому я подумал, что я бы расширил список , так что я могу добавить некоторые функции в этот класс , а также применять операции linq к объекту класса в другом месте, когда это необходимо.На данный момент, учитывая, что я должен вносить в списки людей, по-видимому, так или иначе, я мог бы просто немного демонтировать класс и сделать его статичным или разместить функции класса человека как статические функции. – fullface

ответ

5

PersonCollection - List<Person>, но не наоборот.

Таким образом, вы не можете наложить List<Person> на номер PersonCollection. Вы должны создать новый объект типа PersonCollection

Вы можете сделать это с помощью конструктора:

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

Тогда можно построить PersonCollection из List<Person>

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

PersonCollection pc = new PersonCollection(list); 
+0

Это то, что я не пробовал, но по сути это то же, что и мой последний блок кода, но с конструктором для импорта в PersonCollection.Does. Тот факт, что я получаю сообщение об ошибке, пытающемся использовать в качестве PersonCollection, означает, что я просто не прав, чтобы попытаться это сделать? Если это так, я бы вернулся к классу person, возможно, со статическими функциями для обработки операций с списками ... – fullface

1

В качестве дополнения к Николаю 'ответ, я бы предложил создать собственный метод расширения, чтобы учесть более короткий синтаксис:

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

В качестве побочного примечания я бы предложил переосмыслить вашу номенклатуру: действительно ли ваш PersonCollection представляет собой Collection или это действительно List. Это может показаться педантичным, но часто стоит на самом деле точный про именование, чтобы сделать ваш код более читаемым.

+1

или просто 'new PersonCollection (list)' - OP может построить из IEnumerable, ему не нужен список. – NSGaga

Смежные вопросы