【问题标题】:List addrange different type列表addrange不同类型
【发布时间】:2021-03-09 10:12:01
【问题描述】:

我有 2 个不同类型的列表,其中一个是 float,另一个是 int

List<int> listone = new List<int>();
List<float> listtwo = new List<float>();

如何使用 AddRange() 将 listtwo 中的所有数据附加到 listone ?

我试过了:

listone.AddRange((IEnumerable<int>)listtwo);

它返回错误“InvalidCastException : Specified cast is not valid.”
我也尝试过创建一个名为temp 的新List&lt;int&gt;,填充它将从已经转换为int 的listtwo 中的数据,然后是listone.AddRange(temp),但我想知道是否有更短/更有效的方法来做到这一点?

【问题讨论】:

    标签: c#


    【解决方案1】:

    您可以使用 Select from System.Linqfloat 列表的所有元素转换为 int

    listone.AddRange(listtwo.Select(x=>(int) x))
    

    【讨论】:

    【解决方案2】:

    替代https://stackoverflow.com/a/66544890/1245027:

    如果您确定强制转换是合法的,您可以使用:

    listone.AddRange(listtwo.Cast<int>());
    

    如果从类型 A 转换为类型 B 可能存在问题(并且类型是引用类型):

    listone.AddRange(listtwo.Select(x => x as Type));
    

    What's the benefit of .Cast over .Select? 解决了这两个选项。

    【讨论】:

    • 对于这种特定情况,虽然它更短,但 Cast 和替代答案是否具有相当的效率?
    • 那么这意味着,对不起,godot,这个答案解决方案比你的答案中的解决方案短,我会接受这个,因为在我要求更短的问题中。
    • Sharplab 建议 Cast 生成更简单的 IL(尽管这并不一定意味着更高效):sharplab.io/…sharplab.io/…
    • 没问题,我同意你的观点;)
    • 这种方法比cast to int更有可能失败。如果类型是float 而不是int,你会得到InvalidCastException,而(int) fl 有效。阅读:stackoverflow.com/questions/2760804/…
    猜你喜欢
    • 1970-01-01
    • 2016-01-19
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 2017-03-21
    相关资源
    最近更新 更多