Преобразовать Список <Список <объект >> в 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!!!!!