将 List<int?> 转换为 List<int> 的任何简单方法
Posted
技术标签:
【中文标题】将 List<int?> 转换为 List<int> 的任何简单方法【英文标题】:Any easy way to cast List<int?> to List<int> 【发布时间】:2012-11-24 03:47:25 【问题描述】:目前我使用List<int> ints = tuple.Item2.Select(s => s.Value).ToList()
,但是当 tuple.Item2 有 1000 个项目时,这看起来效率低下。有更好的方法来实现这一点吗?除了使用 for 循环。
【问题讨论】:
^ Konstantin,它是 - 但它是一个真正的好问题。 @ Jack - 这更适合“代码审查” 除了你的代码没有反映s.HasValue == false
时的情况...
你保证所有的对象都会有值吗?
@ Maurice - 他不是。代码审查主题不堆叠!!!
@Maurico:是的。来自 Konstanin 的下一个问题是为什么要使用 List在一个List<T1>
中转换每个元素并将结果存储在另一个List<T2>
中的内置方法是List<T1>.ConvertAll
。
List<int> ints = tuple.Item2.ConvertAll(s => s.Value);
与.Select(...).ToList()
或.Cast(...).ToList()
不同,此方法预先知道列表大小,并防止.ToList()
无法避免的不必要的重新分配。
为此,tuple.Item2
必须确实是 List<int?>
。它不是扩展方法,它不能在通用的IEnumerable<int?>
接口上工作。
【讨论】:
【参考方案2】:您可以简单地使用 Linq Cast<>
来实现这一点。
List<int> ints = tuple.Item2.Cast<int>();
但是如果一个元素不能转换为TResult类型,这个方法会抛出异常。你必须考虑捕获异常。
【讨论】:
谢谢!正是我想要的。 +1 但是效率呢?我认为,无论如何,你不能比 O(n) 做得更好。你必须做.Where(x => x.HasValue)
来检查空值
你最后还需要一个ToList()
。
对于 200000 个项目,这也比原始代码慢 3 倍。
@mikez:真的吗?它看起来比原来的要好。我假设内置扩展方法会更快。我会测试一下。以上是关于将 List<int?> 转换为 List<int> 的任何简单方法的主要内容,如果未能解决你的问题,请参考以下文章
将 List<int?> 转换为 List<int> 的任何简单方法