转换List <list <object>&gt;到IList <ilist <object>&gt; </ilist <object> </list <object>

时间:2012-01-25 16:09:28

标签: c# .net list 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>>

感谢。

6 个答案:

答案 0 :(得分:54)

您无法通过直接投射执行转换 - 这不安全。相反,你应该使用:

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>是不变的,以防止出现这个问题。

答案 1 :(得分:3)

var myOriginalList = new List<List<Object>>();
var converted = ((IList<IList<Object>>)myOriginalList.Cast<IList<Object>>().ToList()); // EDIT: Added .ToList() here

您不需要转换回来 - 您可以在IList List上执行任何操作。

答案 2 :(得分:2)

您必须将列表声明为

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

这样可行,因为首先只创建外部列表。然后,您可以插入与IList<object>兼容的单个项目:

list.Add(new List<object>());
list.Add(new object[10]);

答案 3 :(得分:1)

public IList<IList<object>> Fetch(string data)
{
  IList<IList<object>> p = new List<IList<object>>();

  // add your stuff here

  return p;
}

答案 4 :(得分:1)

您需要将结果变量的声明从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;
    }

答案 5 :(得分:0)

List<T>IList<T>不支持协方差。所以这不编译:

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