【问题标题】:Any easy way to cast List<int?> to List<int>将 List<int?> 转换为 List<int> 的任何简单方法
【发布时间】:2012-11-24 03:47:25
【问题描述】:

目前我使用List&lt;int&gt; ints = tuple.Item2.Select(s =&gt; s.Value).ToList(),但是当 tuple.Item2 有 1000 个项目时,这看起来效率低下。有更好的方法来实现这一点吗?除了使用 for 循环。

【问题讨论】:

  • ^ Konstantin,它是 - 但它是一个真正的好问题。 @ Jack - 这更适合“代码审查”
  • 除了你的代码没有反映s.HasValue == false时的情况...
  • 你保证所有的对象都会有值吗?
  • @ Maurice - 他不是。代码审查主题不堆叠!!!
  • @Maurico:是的。来自 Konstanin 的下一个问题是为什么要使用 List。答案是我必须这样做,因为它是从 3rd 方库返回的。

标签: c# .net


【解决方案1】:

在一个List&lt;T1&gt; 中转换每个元素并将结果存储在另一个List&lt;T2&gt; 中的内置方法是List&lt;T1&gt;.ConvertAll

List<int> ints = tuple.Item2.ConvertAll(s => s.Value);

.Select(...).ToList().Cast(...).ToList() 不同,此方法预先知道列表大小,并防止.ToList() 无法避免的不必要的重新分配。

为此,tuple.Item2 必须确实是 List&lt;int?&gt;。它不是扩展方法,它不能在通用的IEnumerable&lt;int?&gt; 接口上工作。

【讨论】:

    【解决方案2】:

    您可以简单地使用 Linq Cast&lt;&gt; 来实现这一点。

    List<int> ints = tuple.Item2.Cast<int>();
    

    但是如果一个元素不能转换为TResult类型,这个方法会抛出异常。你必须考虑捕获异常。

    【讨论】:

    • 谢谢!正是我想要的。
    • +1 但是效率呢?我认为,无论如何,你不能比 O(n) 做得更好。你必须做.Where(x =&gt; x.HasValue) 来检查空值
    • 你最后还需要一个ToList()
    • 对于 200000 个项目,这也比原始代码慢 3 倍。
    • @mikez:真的吗?它看起来比原来的要好。我假设内置扩展方法会更快。我会测试一下。
    猜你喜欢
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    • 2013-07-06
    • 2013-01-01
    • 1970-01-01
    • 2018-04-28
    • 1970-01-01
    • 2016-12-26
    相关资源
    最近更新 更多