【问题标题】:Convert IList<IList<object>> to List<List<object>> form将 IList<IList<object>> 转换为 List<List<object>> 形式
【发布时间】:2016-06-24 07:48:09
【问题描述】:

在下面的代码中 response.Values 返回 IList>

 IList<IList<object>> values = response.Values; 

我想将values 转换为List&lt;List&lt;object&gt;&gt; 形式。我已经尝试过使用以下语句

List<List<object>> values = response.Values as List<List<object>>

使用此语句后

values = null

但是

response.Values.Count = 82

我该如何解决这个问题?

【问题讨论】:

  • 为什么不将values 用作IList&lt;IList&lt;Object&gt;&gt;?您仍将使用与具体 List 类型相同的方法。
  • 问题不是“我应该将 IList> 转换为 List>”。也许他只是好奇。也许有一种方法只需要 List>.

标签: c#


【解决方案1】:

我不知道为什么你想这样做,但一种方法是:

var result = values.Select(v => v.ToList()).ToList();

但如果列表很大,这可能是一项昂贵的操作,而且我认为转换它没有任何优势。 IList&lt;object&gt; 提供您需要的功能。
我能想到的唯一原因是您想将其传递给期望 List&lt;List&lt;object&gt;&gt; 作为参数类型的方法。

ToList()T 类型枚举的 linq 扩展,它返回包含枚举元素的 List&lt;T&gt;(在您的示例中,Tobject)。

【讨论】:

  • 这有可怕的表现。 Cast&lt;T&gt;() 速度要快几个数量级,因为它不需要迭代每个子列表。
  • @InBetween 如果您不知道基础类型,或者特别是如果基础类型不是 List&lt;object&gt;,则不会从IList&lt;object&gt; 转换为List&lt;object&gt; !
  • 编译并运行得很好:public static List&lt;List&lt;T&gt;&gt; MyCast&lt;T&gt;(this IList&lt;IList&lt;T&gt;&gt; target) =&gt; target.Cast&lt;List&lt;T&gt;&gt;().ToList();。也许我不明白你想说什么。
  • @InBetween 是的,这编译得很好,但运行不正常,特别是如果列表是 List&lt;object&gt; 以外的其他类但实现 IList&lt;object&gt;
  • 哦,好的,我明白了。确实如此。好的,我会澄清我的答案以明确这一点。尽管如此,如果您确实知道底层类型确实是List,并且您只是想规避签名问题(您自己在回答中说的最可能的情况),Cast&lt;T&gt;() 是更快。
【解决方案2】:

您可以通过以下方式以合理的性能做到这一点:

values.Cast<List<T>>().ToList();

这确实按照René Vogt's的答案建议遍历每个List&lt;T&gt;的所有元素,并且性能提升非常显着。

更新。正如 René Vogt 指出的那样,如果IList 类型化对象的底层类型不是Lists 而是实现IList 的其他类型,这将失败。在这种情况下,您只能使用Select 并支付性能损失。

如果您确实知道底层类型确实是List,那么一定要使用Cast,因为它要快得多。

【讨论】:

  • 如果values 中的IList&lt;object&gt; 元素不是List&lt;object&gt; 类型,这将不起作用。我认为即使他们是也行不通。
  • 当然,如果你试图投射到它不是的东西上,它就不会起作用。还有?
  • OP 在哪里指定值真正包含List&lt;object&gt; 元素?他只声明values包含实现IList&lt;object&gt;的元素
  • @RenéVogt 我没有正确理解您的评论。我已在 cmets 中对您的答案进行了澄清,并将相应地编辑我的分析器。
【解决方案3】:

我认为您应该创建一个列表列表,然后循环填充它。像这样的:

List<List<object>> list = new List<List<object>>();

foreach(IList<object> l in values){
    list.Add(new List<object>(l));
}

我没有测试它,但我认为它应该可以工作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多