Почему делает IList <>, имеют меньше функций, чем Список <>?

Использовать такую большую функцию как ConvertAll(), Я должен преобразовать IList кому: List, это болезненно.

10
задан p.campbell 30 January 2017 в 23:05
поделиться

5 ответов

Обратите внимание, что List <> - это реализация IList <> с фактическим хранилищем, то есть он содержит массив в фоновом режиме. В общем, IList <> может быть прокси для чего-то еще. В db4o и linq to sql ваш IList <> может «указывать на запрос», т.е. доступ к списку запускает операцию с базой данных.

Таким образом, вы можете выполнить myList.Skip (600) .Take (20); , чтобы выполнить разбиение на страницы, и только на этом шаге будет выполнен фактический запрос. Список List <> , содержащий миллион записей, будет огромным, в то время как могут быть IList <> , которые имеют огромное Count , но не едят значительный объем памяти - до тех пор, пока вы не получаете доступ к элементам.

ConvertAll потребует создания экземпляров каждого объекта, поэтому это дорогостоящая операция. Таким образом, лучше сделать операцию явной и заставить вас получить конкретную реализацию интерфейса. Очевидно, что преобразование требует, чтобы все объекты в любом случае были созданы, поэтому нет смысла делать это лениво.

18
ответ дан 3 December 2019 в 14:00
поделиться

Почему бы не использовать IEnumerable .Select вместо List .ConvertAll ? Поскольку IList наследует IEnumerable . См. Этот вопрос по SO.

12
ответ дан 3 December 2019 в 14:00
поделиться

Поскольку интерфейс определяет одно поведение, в то время как класс может реализовывать несколько разных интерфейсов, а также иметь неуказанные функции по интерфейсу.

Если вам нужны возможности класса List , не используйте ссылку IList . Используйте ссылку List с самого начала.

4
ответ дан 3 December 2019 в 14:00
поделиться

Просто потому, что IList (T) - это интерфейс, а List (T) - один из нескольких классов в .net bcl который реализует IList (T) для обеспечения функциональности индексатора. Не всем классам, реализующим IList (T) , потребуется метод ConvertAll () , который используется для преобразования универсального списка одного универсального типа в другой.

3
ответ дан 3 December 2019 в 14:00
поделиться

Интерфейс IList разработан для повсеместной реализации. Отсутствие удобных методов означает меньше работы по реализации интерфейса и меньше возможностей для написания ошибок.

К счастью, LINQ делает это и добавляет множество полезных методов с помощью функции «метода расширения». Select и Cast особенно полезны для целей преобразования. Убедитесь, что вы нацелены на .NET Framework 3.5, обратитесь к сборке System.Core и попросите использовать System.Linq; , чтобы увидеть ее.

1
ответ дан 3 December 2019 в 14:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: