假设我有这个枚举:
[Flags]
enum Letters
{
A = 1,
B = 2,
C = 4,
AB = A | B,
All = A | B | C,
}
Run Code Online (Sandbox Code Playgroud)
要检查是否AB
已设置,我可以这样做:
if((letter & Letters.AB) == Letters.AB)
Run Code Online (Sandbox Code Playgroud)
有没有更简单的方法来检查组合标志常量的任何标志是否设置为以下?
if((letter & Letters.A) == Letters.A || (letter & Letters.B) == Letters.B)
Run Code Online (Sandbox Code Playgroud)
你可以换&
一些东西吗?
对于像这样的二进制文件来说不太稳定......
为什么人们总是使用enum值0, 1, 2, 4, 8
而不是0, 1, 2, 3, 4
?
这与位操作等有关吗?
我真的很感激有关如何正确使用它的小样本片段:)
[Flags]
public enum Permissions
{
None = 0,
Read = 1,
Write = 2,
Delete = 4
}
Run Code Online (Sandbox Code Playgroud) 我想要做的是这样的:我有枚举标记值的枚举.
public static class EnumExtension
{
public static bool IsSet<T>( this T input, T matchTo )
where T:enum //the constraint I want that doesn't exist in C#3
{
return (input & matchTo) != 0;
}
}
Run Code Online (Sandbox Code Playgroud)
那么我可以这样做:
MyEnum tester = MyEnum.FlagA | MyEnum.FlagB
if( tester.IsSet( MyEnum.FlagA ) )
//act on flag a
Run Code Online (Sandbox Code Playgroud)
不幸的是,C#的通用,其中约束没有枚举限制,只有类和结构.C#不会将枚举视为结构(即使它们是值类型),因此我无法像这样添加扩展类型.
有没有人知道解决方法?
我有一个结构,我需要填充和写入磁盘(实际上几个).
一个例子是:
byte-6
bit0 - original_or_copy
bit1 - copyright
bit2 - data_alignment_indicator
bit3 - PES_priority
bit4-bit5 - PES_scrambling control.
bit6-bit7 - reserved
Run Code Online (Sandbox Code Playgroud)
在CI中可能会执行以下操作:
struct PESHeader {
unsigned reserved:2;
unsigned scrambling_control:2;
unsigned priority:1;
unsigned data_alignment_indicator:1;
unsigned copyright:1;
unsigned original_or_copy:1;
};
Run Code Online (Sandbox Code Playgroud)
有没有办法在C#中做到这一点,使我能够使用struct dereferencing点运算符访问位?
对于几个结构,我可以在访问器函数中进行包裹移位.
我有很多结构要以这种方式处理,所以我正在寻找一些更容易阅读和更快写的东西.
我正在做一些速度测试,我注意到Enum.HasFlag比使用按位操作慢大约16倍.
有谁知道Enum.HasFlag的内部以及为什么它如此之慢?我的意思是两倍慢不会太糟糕但是当它慢了16倍时它会使该功能无法使用.
如果有人想知道,这是我用来测试其速度的代码.
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
namespace app
{
public class Program
{
[Flags]
public enum Test
{
Flag1 = 1,
Flag2 = 2,
Flag3 = 4,
Flag4 = 8
}
static int num = 0;
static Random rand;
static void Main(string[] args)
{
int seed = (int)DateTime.UtcNow.Ticks;
var st1 = new SpeedTest(delegate
{
Test t = Test.Flag1;
t |= (Test)rand.Next(1, 9);
if (t.HasFlag(Test.Flag4))
num++;
});
var st2 = new SpeedTest(delegate
{
Test t = …
Run Code Online (Sandbox Code Playgroud) 我知道我可以成倍增长但是我不喜欢懒惰的编程.
有没有人设计过一些巫术来自动将枚举作为两个权力?
以下是我要使其具体化的例子:
[Flags]
private enum Targets : uint
{
None = 0,
Campaigns = 1,
CampaignGroups = 2,
Advertisers = 4,
AdvertiserGroups = 8,
AffiliateGroups = 16,
Affiliates = 32,
Creatives = 64,
DetailedLeads = 128,
DetailedSales = 256,
ProgramLeads = 512,
CreativeDeployments = 1024,
CampaignCategories = 2048,
Payouts = 4096,
All = uint.MaxValue
}
Run Code Online (Sandbox Code Playgroud) 如何ListBoxFor
在可能有多个选项的地方枚举枚举?
例如enum
,包含角色:
public enum RoleType
{
[Display(Description = "Administrator", ResourceType = typeof(Resource))]
Administrator = 1,
[Display(Description = "Moderator", ResourceType = typeof(Resource))]
Moderator = 2,
[Display(Description = "Webmaster", ResourceType = typeof(Resource))]
Webmaster = 3,
[Display(Description = "Guest", ResourceType = typeof(Resource))]
Guest = 4,
Etc.... = 5,
}
Run Code Online (Sandbox Code Playgroud)
我已经看到用dropdownlist
/ 完成了这个selectlists
.但是有没有办法为多选列表执行此操作?
[编辑]
这就是我想要使用它的方式,它现在是如何工作的,但不会用其他语言翻译:
var roles = from role r in Enum.GetValues(typeof(RoleType))
select new
{
Id = (int)Enum.Parse(typeof(RoleType), r.ToString()),
Name = r.ToString()
};
searchModel.roles = new …
Run Code Online (Sandbox Code Playgroud) 我正在努力为游戏添加声音效果,虽然我目前的代码工作正常,但我正在寻找一种简化它的方法.基本上,游戏中的每个对象具有指示其材料的字符串值(即"木材","金属"等),并且当两个对象碰撞时,基于该组合播放声音效果.代码基本上如下所示:
if( (matA == "metal" && matB == "wood") || (matA == "wood" && matB == "metal") )
{
//play sound for metal-wood collision
}
Run Code Online (Sandbox Code Playgroud)
但我想知道是否有办法将if语句简化为这样的事情:
if( one of the materials is wood && one of the materials is metal )
{
//play sound for metal-wood collision
}
Run Code Online (Sandbox Code Playgroud) 虽然我掌握了Bitwise Operators的概念,但我不能说在Web开发过程中我遇到了很多用例,我不得不求助于使用Bitwise Operators.
请记住,此问题专门用于在Web语言中使用Bitwise Operators.
我有一个标记的枚举,需要检索其上设置的所有值的名称.
我目前正在利用枚举的ToString()方法,该方法返回以逗号分隔的元素.
public void SetRoles(Enums.Roles role)
{
IList<Entities.Role> roleList = role.ToString("G").Split(',')
.Select(r => new Entities.Role(r.Trim()))
.ToList();
...
}
Run Code Online (Sandbox Code Playgroud)
我敢肯定必须有比这更好的方法.