2016-12-05 23 views
7

我有有成员相同名称的两个相同的枚举,但他们在不同的命名空间,使他们有“不同类型”,但实际上namespace1.enum1 {A,B,C, d,e,f}和namespace2.enum2 {a,b,c,d,e,f}快速的IEnumerable <enum1>列出<enum2> convertation

如何不使用循环将IEnumerable<enum1>转换为List<enum2>最简单的方法是什么?

+2

没有循环就没有安全的方法,但是如果你能够使用'unsafe'代码,你可以直接通过转换来转换内存。但是,如果枚举具有不同的内存布局,这可能会导致内存无效。 – Kroltan

回答

14

那么有些事情要循环某处,但它不必在您的代码中。就在LINQ Select将被罚款:

var result = original.Select(x => (Enum2) x).ToList(); 
+0

如果像这样完成'=>(Enum2)(int)x',演员仍然会工作吗?是不是必须的? – Nkosi

+0

@Nkosi:是的,但你不需要。 –

+0

好了解。谢谢 – Nkosi

3

或者你可以使用Cast(仍然为O(n):-))

var result = original.Cast<int>().Cast<Enum2>().ToList(); 

警告 看来,这并不总是因为工作预计(InvalidCastException可以在某些情况下抛出)。 查看评论来找出原因。

+0

由于'Cast'所做的不恰当的优化,在某些情况下会实际抛出异常。奇怪,但是是真的。还有一篇关于它的帖子 - 会试图挖掘它。 –

+0

参见http://stackoverflow.com/questions/40604183/('int' /'uint'就像'int'/enum。) –

+1

@JonSkeet如果两个枚举的基础类型是相同的,那么它仍然是这是一个问题吗?虽然这只是因为拳击才值得避免。 – juharr

相关问题