我有以下带有标志的枚举:
[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。
我有以下带有标志的枚举:
[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
var f = (DataFiat)selected.Sum();
var tt = (DataFiat)selected.Aggregate((i, t) => i | t);
DataFiat.Public | DataFiat.Listed
。 - Adriaan StanderDataFiat.Public | DataFiat.Listed
? - csteinmueller{1,4}
并不意味着1 *和* 4
,它意味着1 *或* 4,我不关心具体是哪一个。在这种情况下,
3表示
1或2,因此很容易看出
{1,3}变成了
{1,1,2},这意味着
1或1或2或者没有冗余的
1或2,在这种情况下是
Public或
Listed`。 - Corak0
, 1<<0
, 1<<1
, 1<<2
, 1<<3
, 1<<4
等等。在我看来,这种写法更加紧凑和可读,比一个 1 夹杂着许多个零更好理解。对于不了解的人,<<
是一个二进制移位运算符,基本上是通过第二个数字将 1 移动到另一侧,给出与 Corak 给出的相同序列。0 用于表示显式的 None
值。 - Chris var intArr = new[] { 1, 4 };
var sum = intArr.Sum(x => x);
var result = (Test)sum;
返回
DataFlat result = (DataFlat) 0;
foreach (var value in selected)
{
result |= (DataFlat)value;
}
或者如果你想使用LINQ
DataFlat result = (DataFlat) selected.Aggregate(0, (old, current) => old | current);
IEnumerable<DataFiat> selectedDataFiats = selected.Cast<DataFiat>();
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);
}
}
}
selected
数组不包含重复项或已经是或运算结果的值时才有效。 - Dirk