将整数数组转换为枚举标志

8

我有以下带有标志的枚举:

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

And I have an int array, for example:

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

我该如何将此转换为我的枚举类型,使其变成:

DataFiat.Public | DataFiat.Client

谢谢,Miguel。
6个回答

6
var f = (DataFiat)selected.Sum();

1
这段代码很简洁,但只有在selected数组不包含重复项或已经是或运算结果的值时才有效。 - Dirk
1
使用聚合函数可能会有所帮助(DataFiat):selected.Aggregate((i, t) => i | t); - stepandohnal

4
像这样的东西怎么样?
var tt = (DataFiat)selected.Aggregate((i, t) => i | t);

是的,我进行了测试,它可以正常工作,生成了 DataFiat.Public | DataFiat.Listed - Adriaan Stander
帮我理解一下:为什么1、3的结果是DataFiat.Public | DataFiat.Listed - csteinmueller
@csteinmueller - 好的,{1,4}并不意味着1 *和* 4,它意味着1 *或* 4,我不关心具体是哪一个。在这种情况下,3表示1或2,因此很容易看出{1,3}变成了{1,1,2},这意味着1或1或2或者没有冗余的1或2,在这种情况下是PublicListed`。 - Corak
好的,现在我明白了 :) - csteinmueller
@Corak: 我更喜欢将其表示为 0, 1<<0, 1<<1, 1<<2, 1<<3, 1<<4 等等。在我看来,这种写法更加紧凑和可读,比一个 1 夹杂着许多个零更好理解。对于不了解的人,<< 是一个二进制移位运算符,基本上是通过第二个数字将 1 移动到另一侧,给出与 Corak 给出的相同序列。0 用于表示显式的 None 值。 - Chris
显示剩余4条评论

3
这段代码:
        var intArr = new[] { 1, 4 };
        var sum = intArr.Sum(x => x);
        var result = (Test)sum;

返回

示例图片


确定吗?我测试了一下,我得到的是客户端...你应该得到公共,因为你有1个和公共|列出,因为你有3个,所以最终你应该得到公共|列出... - Miguel Moura

2
DataFlat result = (DataFlat) 0;

foreach (var value in selected)
{
    result |= (DataFlat)value;
}

或者如果你想使用LINQ

DataFlat result = (DataFlat) selected.Aggregate(0, (old, current) => old | current);

1
你是指这个吗?
IEnumerable<DataFiat> selectedDataFiats = selected.Cast<DataFiat>();

这句话的意思是:“这只是将每个 int 转换为 DataFiat。”,同时保留了 HTML 标签,不进行解释。

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#编译器(先转换为object),就没问题了。但是当原始数组真的是object[]时,这种方法就行不通了。希望这可以帮到你。

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