c# - 如何将数字评估为可能的组合
问题描述
我正在寻找一种更简单的方法来评估一些数字并设置一些属性。每个十六进制数字都需要评估以查看它支持的内容。给定一个数字模式 ABCDEF 这里是每个数字支持的。
- A = 8 支持 B,4 支持 C,2 支持 D,1 支持 E,0 无
- B = 8 支持 F,4 支持 G,2 支持 H,1 支持 I,0 无
- C = 8 支持 J,4 支持 K,2 支持 L,1 支持 M,0 无
- D = 8 支持 O,4 支持 P,2 支持 Q,1 支持 R,0 无
- E = 8 支持 S,4 支持 T,2 支持 U,1 支持 V,0 无
- F = 8 支持 W,4 支持 X,2 支持 Y,1 支持 Z,0 无
支持的字母 BZ 是代表所有可能支持的项目的单个布尔属性。
因此,评估的编号 0B6000 支持 FHIKL,编号 076000 支持 KLMNO,编号 0B3000 支持 FHIQR。我的第一个想法是获得 8,4,2,1 的组合,然后循环每个数字检查每个组合的总数。也许有更简单的方法?
解决方案
你对“聪明”或“容易”有什么标准?
如果您擅长字符串解析和操作,则可以使用 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"
推荐阅读
- automation - 如何更改赛普拉斯中的日期格式
- java - 如何检查字符串是否是有效的 Json Schema?
- c++ - Spirit X3,指的是之前匹配的值
- mysql - 需要解释“致命错误:在 null 上调用成员函数 query()....”
- git - 如何在服务器上运行不同版本的 git?
- pandas - 熊猫均值 vs sum/len
- ggplot2 - ggpaired 根据条件更改线条颜色
- c# - Git 存储库创建 Visual Studio 2019 失败
- powershell - 将空字符串作为变量值从ansible playbook传递到powershell?
- java - 一般 JNA 问题(Discord 游戏 SDK (C) -> Java)