List <> Versus IEnumerable <>, при определении нового класса или нового класса модели представления - PullRequest
4 голосов
/ 21 января 2012

Я определил новый класс ViewModel следующим образом: -

public class myviewmodel
{
    public IEnumerable<Question> Questions { get; set; }
    public decimal Total { get; set; }
    public string Message { get; set; }

}

но я также могу определить его как

public class myviewmodel
{
    public List<Question> Questions { get; set; }
    public decimal Total { get; set; }
    public string Message { get; set; }

}

, и это также может произойти, если я хочу создать новый класс модели; Так в чем же разница между двумя аппрейсами? BR

Ответы [ 5 ]

3 голосов
/ 21 января 2012

Я бы держался подальше от List<T> в пользу ICollection<T>, если это возможно: использование "простого" списка слишком многое говорит о вашей реализации. IEnumerable<T> - хороший выбор, поскольку он дает вам максимальную гибкость при выборе фактической реализации, но может оказаться недостаточным, если вам нужно узнать количество доступных вам элементов, не перечисляя их в коллекции.

1 голос
/ 21 января 2012

Вы также можете использовать IList<Question>.

в чем разница между двумя аппрейсами?

IEnumerable<> является более общим (но также и менее функциональным). Вы можете назначить его из любого запроса Linq, не беспокоясь о фактическом типе списка.

Версия List<> более точно определена, возможно, вам придется преобразовать ее в список, прежде чем вы сможете ее назначить. Это дает вам больше функциональности.

Вы, вероятно, хотите что-то вроде IList<QuestionViewModel>

0 голосов
/ 23 января 2012

Я думаю, что другие уже ответили хорошо, я просто хотел бы добавить одну вещь:

IList не всегда плох, в отличие от ICollection, поскольку он должен представлять информацию, которая уже находится в памяти (таким образом, обеспечивая индексацию и свойство Count). В этом случае (информация о памяти) ICollection не будет так хорош, как вызов Count() может перебирать коллекцию, даже если итератор не ленив.

0 голосов
/ 21 января 2012

Это зависит. В целом, вы должны предпочесть вернуть интерфейс, такой как ICollection, IList или IEnumerable, поскольку он дает вам возможность изменить фактическую реализацию без нарушения кода (при условии, что реализация придерживается контракта интерфейса).

Теперь выбор интерфейса зависит от того, что вам нужно сделать. Например, если можно добавить элементы в коллекцию через Questions.Add(), вы не можете использовать IEnumerable, так как он не предлагает такой метод.

0 голосов
/ 21 января 2012

IEnumerable является более абстрактным и обычно предпочтительнее List или IList, если это возможно.Просто потому, что это интерфейс, и у вас есть больше возможностей реализации.

См. этот вопрос .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...