Преобразовать Список <Список <объект >> в IList <IList <объект >>
Я написал метод, который public List<List<object>> Fetch(string data)
,
внутри я создаю List<List<object>> p = new List<List<object>>();
мой босс теперь хочет вернуть IList<IList<object>>
вместо List<List<object>>
, т.е.
public IList<IList<object>> Fetch(string data)
,
поэтому, когда я пытаюсь сделать return (IList<IList<object>>) p; //throws an exception
Как мне конвертировать С List<List<object>>
по IList<IList<object>>
и обратно на List<List<object>>
Ответы
Ответ 1
Вы не можете выполнить это преобразование с помощью прямого литья - это будет небезопасно. Вместо этого вы должны использовать:
IList<IList<object>> ret = new List<IList<object>>();
Затем для каждого "подсписка" вы можете использовать:
// Or whatever
ret.Add(new List<object>());
Наконец, просто верните ret
.
Вы можете использовать LINQ для выполнения преобразования существующего List<List<object>>
при его возврате, но лучше было бы создать более подходящий тип, как показано выше.
Чтобы понять, почему некоторые из существующих ответов неверны, предположим, что вы могли бы сделать это:
IList<IList<object>> p = new List<List<object>>();
Тогда это было бы верно:
List<List<object>> listOfLists = new List<List<object>>();
IList<IList<object>> p = listOfLists;
p.Add(new object[]);
List<object> list = p[0];
Но p[0]
является ссылкой на object[]
, а не на List<object>
... наш предположительно безопасный тип кода больше не выглядит безопасным...
К счастью, IList<T>
является инвариантным для предотвращения этой проблемы.
Ответ 2
var myOriginalList = new List<List<Object>>();
var converted = ((IList<IList<Object>>)myOriginalList.Cast<IList<Object>>().ToList()); // EDIT: Added .ToList() here
Вам не нужно конвертировать назад - вы можете сделать что угодно на IList
, которое вы могли бы на List
.
Ответ 3
Вам нужно будет объявить свой список как
IList<IList<object>> list = new List<IList<object>>(); // Works!
Это работает, потому что только внешний список создается в первую очередь. Затем вы можете вставить отдельные элементы, совместимые с IList<object>
:
list.Add(new List<object>());
list.Add(new object[10]);
Ответ 4
public IList<IList<object>> Fetch(string data)
{
IList<IList<object>> p = new List<IList<object>>();
// add your stuff here
return p;
}
Ответ 5
Вам нужно изменить объявление переменной результата с List<List<object>
на IList<IList<object>>
Чтобы создать экземпляр List<IList<object>>
И каждый элемент в результате может иметь тип List<object>
static IList<IList<object>> Test()
{
IList<IList<object>> result = new List<IList<object>>();
var item = new List<object>() { "one", "two", "three" };
result.Add(item);
return result;
}
Ответ 6
List<T>
и IList<T>
не поддерживают ковариацию. Поэтому это не скомпилируется:
List<List<string>> list = new List<IList<string>>(); // DOES NOT COMPILE!!!!!