将 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&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 方库返回的。 【参考方案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:真的吗?它看起来比原来的要好。我假设内置扩展方法会更快。我会测试一下。

以上是关于将 List<int?> 转换为 List<int> 的任何简单方法的主要内容,如果未能解决你的问题,请参考以下文章

如何将 List<int> 转换为 string[]?

将 List<int?> 转换为 List<int> 的任何简单方法

将 list<int> 转换为连接的整数字符串?

将 ul li 转换为字符串列表 c#

无法将 initializer_list 转换为 class<int>

是否可以将 MVC C# List<int> 转换为 javascript 数组?