首页 > 解决方案 > 如何将数字评估为可能的组合

问题描述

我正在寻找一种更简单的方法来评估一些数字并设置一些属性。每个十六进制数字都需要评估以查看它支持的内容。给定一个数字模式 ABCDEF 这里是每个数字支持的。

支持的字母 BZ 是代表所有可能支持的项目的单个布尔属性。

因此,评估的编号 0B6000 支持 FHIKL,编号 076000 支持 KLMNO,编号 0B3000 支持 FHIQR。我的第一个想法是获得 8,4,2,1 的组合,然后循环每个数字检查每个组合的总数。也许有更简单的方法?

标签: c#

解决方案


你对“聪明”或“容易”有什么标准?

如果您擅长字符串解析和操作,则可以使用 LINQ 和一些简单的计算来获得支持的值列表(作为字符):

Convert.ToString(int.Parse(hex, NumberStyles.HexNumber), 2)
    .Reverse()
    .Select((v, i) => (v, i))
    .Where(e => e.v == '1')
    .Select(e => (char)('Z' - e.i - 1));

您还可以使用所有受支持的项目声明 a Flags enum,并将该值转换为表示所有这些受支持值之和的单个值。

[System.Flags]
public enum Supported{
    A = 1,       // or A = 1 << 0
    B = A << 1,  // or B = 1 << 1
    C = B << 1,  // or C = 1 << 2
    // ...
}
var supported = (Supported)uint.Parse(hex, NumberStyles.HexNumber);
Console.WriteLine(supported); // e.g. "A, B"
Console.WriteLine((supported | Supported.B) != 0); // e.g. "True"

推荐阅读