我有以下带标志的枚举:
[Flags]
public enum DataFiat {
Public = 1,
Listed = 2,
Client = 4
} // DataFiat
我有一个int数组,例如:
int[] selected = new int[] { 1, 4 }
如何将此转换为我的枚举,这将成为:
DataFiat.Public | DataFiat.Client
谢谢你, 米格尔
答案 0 :(得分:6)
var f = (DataFiat)selected.Sum();
答案 1 :(得分:4)
像
这样的东西var tt = (DataFiat)selected.Aggregate((i, t) => i | t);
答案 2 :(得分:3)
这个片段:
var intArr = new[] { 1, 4 };
var sum = intArr.Sum(x => x);
var result = (Test)sum;
返回
答案 3 :(得分:2)
DataFlat result = (DataFlat) 0;
foreach (var value in selected)
{
result |= (DataFlat)value;
}
或者如果你想使用LINQ
DataFlat result = (DataFlat) selected.Aggregate(0, (old, current) => old | current);
答案 4 :(得分:1)
你是说这个?
IEnumerable<DataFiat> selectedDataFiats = selected.Cast<DataFiat>();
这使每个int
投射到DataFiat
。
答案 5 :(得分:1)
如果它真的是一个对象[],你不能只是转换数组。您可以非常轻松地创建新阵列:
var enumArray = originalArray.Cast<DataFiat>().ToArray();
如果它实际上是一个int []数组,那么你可以进行转换 - 尽管你必须先与C#编译器很好地对话:
using System;
class Program
{
enum Foo
{
Bar = 1,
Baz = 2
}
static void Main()
{
int[] ints = new int[] { 1, 2 };
Foo[] foos = (Foo[]) (object) ints;
foreach (var foo in foos)
{
Console.WriteLine(foo);
}
}
}
C#编译器不相信从int []到Foo []的转换(并且在C#的规则中没有)...但是这个转换的CLR很好,所以因为你可以说服C#编译器一起玩(通过先铸造到对象),没关系。
当原始数组确实是对象[]时,这不起作用。
希望这会有所帮助..