Any easy way to cast List<int?> to List<int>
目前我使用List ints = tuple.Item2.Select(s => s.Value).ToList(),但当tuple.item2有1000个项时,这看起来效率很低。有更好的方法来实现这一点吗?除了使用for循环。
- ^康斯坦丁,这是一个很好的问题。@杰克-这更适合"代码审查"
- 此外,您的代码不反映当s.HasValue == false时的情况。
- 您是否保证所有对象都有值?
- @莫里斯-他没有。代码审查主题不是堆栈!!!!
- @ Maurico:是的。Konstanin的下一个问题就是为什么要使用list答案是我必须这样做,因为它是从第三方库返回的。
- @杰克,所以你应该考虑一下它可能含有null,对吗?
- 不,它没有。它从不返回空值。不知道lib开发人员为什么使用list
在一个List中转换每个元素并将结果存储到另一个List中的内置方法是List.ConvertAll。
1
| List<int> ints = tuple.Item2.ConvertAll(s => s.Value); |
与.Select(...).ToList()或.Cast(...).ToList()不同,此方法提前知道列表大小,并防止.ToList()无法避免的不必要的重新分配。
为了实现这一点,tuple.Item2必须是一个List。它不是一个扩展方法,它不能在通用的IEnumerable接口上工作。
- 谢谢。那么,这会比操作代码更好吗?
- +1:大约快2.5倍
- +1.在Linq框外思考:)
您可以简单地使用LinqCast<>来实现这一点。
1
| List<int> ints = tuple.Item2.Cast<int>(); |
但是,如果一个元素不能强制转换为tresult类型,则此方法将引发一个异常。您必须考虑捕获异常。
- 谢谢!正是我要找的。
- _____干杯!
- +1但是效率呢?不管怎样,你不能比演员组做得更好。你必须做EDOCX1[0]来检查空值
- 最后你还需要一个ToList()。
- 对于200000个项目,这比原始代码慢3倍。
- @米凯兹:真的吗?它看起来比原来的好。我假设内置扩展方法会更快。我来测试一下。
- @Romanpekar&mike你是对的。但是我已经建议了欺骗某人的方法,它是有效的:)
- @behnamesmaili:欺骗不是我所期望的,而是谢谢:)
- @杰克,我只是开玩笑。如果你把代码放在trick-catch中,你的代码会更有效。如果你不相信我,请检查:stackoverflow.com/questions/8928403/&hellip;。