将C#中的List<ushort>转换为List<short>

5

我想这样做:

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

但是我收到了“指定的转换无效”的InvalidCastException错误。

如何快速高效地对上述集合进行转换?


1
可能是Puzzling Enumerable.Cast InvalidCastException的重复问题。 - Ani
1
@Ani:我不认为这是一个重复的问题,因为我知道你不能将int强制转换为long(它们的大小不同),但我希望可以从ushortshort进行强制转换,因为它们的大小相同。换句话说,(ushort[])(object)new short[] { 0, -1 }是完全有效的C#代码。 - Gabe
@Gabe:这是同样的问题。(short)((ushort)1)(long)((int)1)(为了清晰而进行的冗余转换)都是有效的C#代码。问题与混合数字转换和拆箱有关。http://blogs.msdn.com/b/ericlippert/archive/2009/03/19/representation-and-identity.aspx - Ani
我将指出一个明显的问题,即无符号列表中包含的值大于有符号短整型允许的最大值。 - Security Hound
@Ani: (long)((int)1) 是一种转换,而 (short)((ushort)1) 则是一种强制类型转换。它们在 C# 中具有相同的语法,但第一个会执行函数调用,而第二个则不会(或者不必要)。 - Gabe
@Gabe:OP面临的问题类似于为什么(short)(object)(ushort)1会在运行时抛出异常。 - Ani
2个回答

9
您可以使用ConvertAll:
List<short> sList = uList.ConvertAll(x => (short)x);

7
List<short> sList = uList.Select(i => (short)i).ToList();

我个人更喜欢这种解决方案,因为它是标准的LINQ。 - Kirk Woll
在我回来之前,我已经按照这种方式实现了它,并且它运行良好。我不确定使用这种方法和使用ConvertAll之间是否存在性能差异。 - Tomislav Markovski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接