【问题标题】:C# Casting List<ushort> to List<short>C# 将 List<ushort> 转换为 List<short>
【发布时间】:2011-02-03 16:07:55
【问题描述】:

我想这样做:

List<ushort> uList = new List<ushort>() { 1, 2, 3 };
List<short> sList = uList.Cast<short>().ToList();

但我得到 InvalidCastException “指定的演员表无效。”

如何才能快速高效地投出上述集合?

【问题讨论】:

  • @Ani:我不会认为这是重复的,因为我知道您不能将 int 转换为 long(它们的大小不同),但我希望来自 @ 的演员987654326@ 到 short 是可能的,因为它们的大小相同。换句话说,(ushort[])(object)new short[] { 0, -1 } 是完全有效的 C#。
  • @Gabe:同样的问题。 (short)((ushort)1)(long)((int)1) 一样是有效的 C#(为了清楚起见,进行了冗余转换)。问题与混合数字转换和拆箱有关。 blogs.msdn.com/b/ericlippert/archive/2009/03/19/…
  • 我要指出一个明显的问题,即无符号列表中包含的值大于有符号短允许的最大值。
  • @Ani:(long)((int)1) 是转换,而(short)((ushort)1) 是转换。它们在 C# 中的语法相同,但第一个执行函数调用,而第二个不执行(或不必执行)。

标签: c# .net collections casting


【解决方案1】:

你可以使用 ConvertAll:

List<short> sList = uList.ConvertAll(x => (short)x);

【讨论】:

    【解决方案2】:
    List<short> sList = uList.Select(i => (short)i).ToList();
    

    【讨论】:

    • 我更喜欢这个解决方案,IMO,因为它是标准的 LINQ。
    • 在我回到这里之前,我已经以这种方式实现了它,它运行良好。我不确定这与使用 ConvertAll 之间是否存在性能差异。
    猜你喜欢
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    相关资源
    最近更新 更多