преобразовать список <List <object>> в IList <IList <object>> - PullRequest
19 голосов
/ 25 января 2012

Я написал метод, который 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>>

Спасибо.

Ответы [ 6 ]

54 голосов
/ 25 января 2012

Вы не можете выполнить это преобразование через прямое приведение - это не будет безопасно.Вместо этого вы должны использовать:

IList<IList<object>> ret = new List<IList<object>>();

Тогда для каждого «подсписка» вы можете использовать:

// Or whatever
ret.Add(new List<object>());

Наконец, просто верните ret.

You может использовать 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> является инвариантомчтобы предотвратить именно эту проблему.

3 голосов
/ 25 января 2012
var myOriginalList = new List<List<Object>>();
var converted = ((IList<IList<Object>>)myOriginalList.Cast<IList<Object>>().ToList()); // EDIT: Added .ToList() here

Вам не нужно конвертировать обратно - вы можете сделать что угодно на IList, что вы можете на List.

2 голосов
/ 25 января 2012

Вы должны объявить свой список как

IList<IList<object>> list = new List<IList<object>>(); // Works!

Это работает, потому что в первую очередь создается только внешний список.Затем вы можете вставить отдельные элементы, которые совместимы с IList<object>:

list.Add(new List<object>());
list.Add(new object[10]);
1 голос
/ 25 января 2012

Вам необходимо изменить объявление переменной результата с 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;
    }
1 голос
/ 25 января 2012
public IList<IList<object>> Fetch(string data)
{
  IList<IList<object>> p = new List<IList<object>>();

  // add your stuff here

  return p;
}
0 голосов
/ 25 января 2012

List<T> и IList<T> не поддерживают ковариацию. Так что это не компилируется:

List<List<string>> list = new List<IList<string>>(); // DOES NOT COMPILE!!!!!
...