将Int数组转换为Enum标志

时间:2014-02-19 12:10:24

标签: c#

我有以下带标志的枚举:

[Flags]
public enum DataFiat {
  Public = 1,
  Listed = 2,
  Client = 4
} // DataFiat

我有一个int数组,例如:

int[] selected = new int[] { 1, 4 }

如何将此转换为我的枚举,这将成为:

DataFiat.Public | DataFiat.Client

谢谢你, 米格尔

6 个答案:

答案 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;

返回

enter image description here

答案 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#编译器一起玩(通过先铸造到对象),没关系。

当原始数组确实是对象[]时,这不起作用。

希望这会有所帮助..