将List <List <object >>转换为IList <IList <object >>

dav*_*vid 22 .net c# list

我写了一个方法 public List<List<object>> Fetch(string data),在我创建的内部 List<List<object>> p = new List<List<object>>();

我的老板现在想要返回一个IList<IList<object>>而不是List<List<object>>ie
public IList<IList<object>> Fetch(string data),

所以当我尝试的时候 return (IList<IList<object>>) p; //throws an exception

我如何转换 List<List<object>>IList<IList<object>> 和返回List<List<object>>

谢谢.

Jon*_*eet 60

您不能通过直接铸造执行转换 - 这不安全.相反,你应该使用:

IList<IList<object>> ret = new List<IList<object>>();
Run Code Online (Sandbox Code Playgroud)

然后,对于每个"子列表",您可以使用:

// Or whatever
ret.Add(new List<object>());
Run Code Online (Sandbox Code Playgroud)

最后,回来吧ret.

可以使用LINQ来执行现有的转换List<List<object>>,当您返回它-但它会更好,只是创造一个更加合适的类型入手,如上图所示.


要理解为什么某些现有答案是错误的,假设您可以这样做:

IList<IList<object>> p = new List<List<object>>();
Run Code Online (Sandbox Code Playgroud)

那么这将是有效的:

List<List<object>> listOfLists = new List<List<object>>();
IList<IList<object>> p = listOfLists;
p.Add(new object[]);
List<object> list = p[0];
Run Code Online (Sandbox Code Playgroud)

但是p[0]是对a的引用object[],而不是List<object>...我们所谓的类型安全代码看起来不再安全......

幸运的是,IList<T>是不变的,以防止这个问题.

  • @JonSkeet哦不知道数组也实现了IList (4认同)
  • 谢谢你解释磕磕绊绊的石头. (3认同)

Oli*_*bes 7

您必须将列表声明为

IList<IList<object>> list = new List<IList<object>>(); // Works!
Run Code Online (Sandbox Code Playgroud)

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

list.Add(new List<object>());
list.Add(new object[10]);
Run Code Online (Sandbox Code Playgroud)


Chr*_*ain 5

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

您不需要转换回来 - 您可以做任何IList您可以做的事情List

  • 为什么还要创建一个新列表呢?从创建正确的类型开始就更简单了。 (2认同)