c# - 从具有多个零值的枚举中获取项目名称

标签 c# .net string enums formatting

我在处理一些具有多个零值的遗留枚举时遇到了困难。每当我对其中一个非零值调用 ToString 时,除了第一个零值之外的所有值都包括在内。

有什么方法可以在不借助字符串操作或反射的情况下隔离非零值名称?

//all of the following output "Nada, Zilch, One"
Console.WriteLine(TestEnum.One);
Console.WriteLine(Convert.ToString(TestEnum.One));
Console.WriteLine(TypeDescriptor.GetConverter(typeof(TestEnum))
                      .ConvertToString(TestEnum.One));

[Flags]
enum TestEnum
{
    Zero = 0,
    Nada = 0,
    Zilch = 0,
    One = 1
}

编辑

我了解不建议使用具有相同值的多个项目,但是有问题的枚举是在我无法更改的旧程序集中定义的。事实上,mscorlib v4 中有 12 个公共(public)枚举违反了此建议,由以下简单的 LINQ 查询确定:

var types = typeof (void).Assembly.GetTypes()
    .Where(type => type.IsEnum &&
                   type.IsPublic &&
                   Enum.GetValues(type).Cast<object>()
                       .GroupBy(value => value)
                       .Any(grp => grp.Count() > 1))
    .ToList();

最佳答案

这是一种选择。它有效,但它有点难看。值/名称变量不会改变,因此只需要计算一次。

假设你有一个稍微复杂一点的枚举,比如:

[Flags]
public enum TestEnum
{
    Zero = 0,
    Nada = 0,
    Zilch = 0,
    One = 1,
    Two = 2,
    Three = 3,
    Four = 4
}

这里有一些你可以使用的代码:

var input = TestEnum.One | TestEnum.Two;
var values = (TestEnum[]) Enum.GetValues(typeof (TestEnum));
var names = Enum.GetNames(typeof (TestEnum));
var result = values
    .Select((value, index) =>
            input == value || (value != 0 && (input & value) == value)
                ? names[index]
                : null)
    .Where(name => name != null);
var text = string.Join(", ", result);
Console.WriteLine(text);

关于c# - 从具有多个零值的枚举中获取项目名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9073777/

相关文章:

c# - 如何更快地将 Bitmap 转换为 byte[,,]?

c# - ASP.NET Core 中从 MySQL 服务器获取数据

c# - Blazor - 如何获取布局 @Body 路径?

.net - F# 短路模式匹配

c# - 在 VS2015 社区中使用 ASP.NET 5 时的 "Cannot resolve symbol ' 系统 '"和其他命名空间

objective-c - 在 Objective C 中格式化 float

c# - FROM 字符串的泛型类型转换

.net - 从现有的winforms应用程序中分离 View 层的路径?

string - 在 Clojure 中无需转义引号即可轻松处理文本?

string - Haskell中case语句中的模式匹配变量