Использовать такую большую функцию как ConvertAll()
, Я должен преобразовать IList
кому: List
, это болезненно.
Обратите внимание, что List <>
- это реализация IList <>
с фактическим хранилищем, то есть он содержит массив в фоновом режиме. В общем, IList <>
может быть прокси для чего-то еще. В db4o и linq to sql ваш IList <>
может «указывать на запрос», т.е. доступ к списку запускает операцию с базой данных.
Таким образом, вы можете выполнить myList.Skip (600) .Take (20);
, чтобы выполнить разбиение на страницы, и только на этом шаге будет выполнен фактический запрос. Список List <>
, содержащий миллион записей, будет огромным, в то время как могут быть IList <>
, которые имеют огромное Count
, но не едят значительный объем памяти - до тех пор, пока вы не получаете доступ к элементам.
ConvertAll
потребует создания экземпляров каждого объекта, поэтому это дорогостоящая операция. Таким образом, лучше сделать операцию явной и заставить вас получить конкретную реализацию интерфейса. Очевидно, что преобразование требует, чтобы все объекты в любом случае были созданы, поэтому нет смысла делать это лениво.
Почему бы не использовать IEnumerable
вместо List
? Поскольку IList
наследует IEnumerable
. См. Этот вопрос по SO.
Поскольку интерфейс определяет одно поведение, в то время как класс может реализовывать несколько разных интерфейсов, а также иметь неуказанные функции по интерфейсу.
Если вам нужны возможности класса List
, не используйте ссылку IList
. Используйте ссылку List
с самого начала.
Просто потому, что IList (T)
- это интерфейс, а List (T)
- один из нескольких классов в .net bcl который реализует IList (T)
для обеспечения функциональности индексатора. Не всем классам, реализующим IList (T)
, потребуется метод ConvertAll ()
, который используется для преобразования универсального списка одного универсального типа в другой.
Интерфейс IList
разработан для повсеместной реализации. Отсутствие удобных методов означает меньше работы по реализации интерфейса и меньше возможностей для написания ошибок.
К счастью, LINQ делает это и добавляет множество полезных методов с помощью функции «метода расширения». Select
и Cast
особенно полезны для целей преобразования. Убедитесь, что вы нацелены на .NET Framework 3.5, обратитесь к сборке System.Core
и попросите использовать System.Linq;
, чтобы увидеть ее.