Привести IList в список

Я пытаюсь преобразовать тип IList в тип List, но каждый раз получаю сообщение об ошибке.

List<SubProduct> subProducts= Model.subproduct;

Model.subproduct возвращает IList<SubProduct>.


person Pankaj    schedule 05.02.2010    source источник
comment
лучше всего программировать с интерфейсом (IList), а не с внедрением (List). Переход к списку - ненужный актерский состав. Теперь вам нужно добавить обработку ошибок, если на случай, если реализация IList, которая не является списком, войдет в этот путь кода.   -  person Brian Leahy    schedule 05.02.2010
comment
Да, но у IList нет того, что есть у List, например AddRange   -  person Serj Sagan    schedule 20.11.2017


Ответы (8)


Пытаться

List<SubProduct> subProducts = new List<SubProduct>(Model.subproduct);

or

List<SubProduct> subProducts = Model.subproducts as List<SubProduct>;
person Pbirkoff    schedule 05.02.2010
comment
Это правильный ответ, но есть ли причина, по которой вы хотите иметь дело со списком, а не с IList? В большинстве случаев использование IList - лучший выбор. - person Keith Rousseau; 05.02.2010
comment
IList ‹SubProduct› subProducts = Model.subproduct; - person Brian Leahy; 05.02.2010
comment
@KeithRousseau Я столкнулся с проблемой, когда мне нужно было использовать метод AddRange (). - person ScubaSteve; 08.05.2015
comment
Второй вариант небезопасен, поскольку предполагает, что Model.subproducts уже имеет тип List<SubProduct> под крышками. Если это другая реализация IList<SubProduct>, например ReadOnlyCollection<SubProduct>, она молча вернет null и, вероятно, вызовет очень запутанный NullReferenceException позже при выполнении программы. И действительно, если мы знаем, что это всегда будет List<T>, тогда какой вообще смысл возвращать IList<T>? - person sstan; 27.11.2017

Как насчет этого:

List<SubProduct> subProducts = Model.subproduct.ToList();
person Mark Seemann    schedule 05.02.2010

В моем случае мне пришлось это сделать, потому что ни одно из предложенных решений не было доступно:

List<SubProduct> subProducts = Model.subproduct.Cast<SubProduct>().ToList();
person bluish    schedule 17.12.2013

List<SubProduct> subProducts= (List<SubProduct>)Model.subproduct;

Неявное преобразование терпит неудачу, потому что List<> реализует IList, а не наоборот. Итак, вы можете сказать IList<T> foo = new List<T>(), но не List<T> foo = (some IList-returning method or property).

person Webleeuw    schedule 05.02.2010
comment
Небольшая придирка: List ‹T› не является производным от IList, он реализует IList. Слово «производный» подразумевает, что между ними существует связь по наследству. - person Chris Dunaway; 05.02.2010

List<ProjectResources> list = new List<ProjectResources>();        
IList<ProjectResources> obj = `Your Data Will Be Here`;
list = obj.ToList<ProjectResources>();

Это преобразует объект IList в объект списка.

person Hudhaifa Yoosuf    schedule 09.06.2016

Во всех остальных ответах рекомендуется использовать AddRange с IList.

Более элегантное решение, позволяющее избежать приведения типов, - реализовать расширение IList для выполнения этой работы.

В VB.NET:

<Extension()>
Public Sub AddRange(Of T)(ByRef Exttype As IList(Of T), ElementsToAdd As IEnumerable(Of T))
   For Each ele In ElementsToAdd
      Exttype.Add(ele)
   Next
End Sub

И в C #:

public void AddRange<T>(this ref IList<T> Exttype, IEnumerable<T> ElementsToAdd)
{
    foreach (var ele in ElementsToAdd)
    {
        Exttype.Add(ele);
    }
}
person user11331434    schedule 08.04.2019

Если у вас есть IList, содержащий интерфейсы, вы можете преобразовать его следующим образом:

Список в IList

List<Foo> Foos = new List<Foo>(); 
IList<IFoo> IFoos = Foos.ToList<IFoo>();

IList в список

IList<IFoo> IFoos = new List<IFoo>();
List<Foo> Foos = new List<Foo>(IFoos.Select(x => (Foo)x));

Предполагается, что Foo имеет IFoo интерфейс.

person JasonLandbridge    schedule 13.10.2019

Это лучший вариант для приведения / преобразования списка универсального объекта в список строк.

object valueList;
List<string> list = ((IList)valueList).Cast<object>().Select(o => o.ToString()).ToList();
person Ghebrehiywet    schedule 27.10.2017
comment
valueList должен быть списком объектов - person ; 10.11.2017