2012-01-21 6 views
2

я определил новый класс ViewModel следующим образом: -List <> Versus IEnumerable <>, при определении нового класса или новый класс 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

ответ

0

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

См. this question.

2

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

1

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

В чем разница между двумя оценками?

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

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

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

+1

Что такое практическое преимущество '' IList' '' '' '' ''? – Muflix

0

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

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

0

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

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

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