假设我有这个枚举:
[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)
你可以换&一些东西吗?
对于像这样的二进制文件来说不太稳定......
我想要做的是这样的:我有枚举标记值的枚举.
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#不会将枚举视为结构(即使它们是值类型),因此我无法像这样添加扩展类型.
有没有人知道解决方法?
我正在做一些速度测试,我注意到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) 我需要从wav文件中提取单个通道的样本,该文件最多包含12个(11.1格式)通道.我知道在正常的立体声文件中,样本是交错的,先是左边,然后是右边,就像这样,
[1st L] [1st R] [2nd L] [2nd R]...
Run Code Online (Sandbox Code Playgroud)
那么,要阅读左声道,我会这样做,
for (var i = 0; i < myByteArray.Length; i += (bitDepth / 8) * 2)
{
// Get bytes and convert to actual samples.
}
Run Code Online (Sandbox Code Playgroud)
为了获得正确的渠道,我只是这样做for (var i = (bitDepth / 8)....
但是,对于超过2个频道的文件,使用了什么顺序?
我正在尝试创建一个帮助方法来列出Enum值中设置的所有位的名称(用于记录目的).我想要一个方法,它将返回一些变量中设置的所有枚举值的列表.在我的例子中
[Flag]
Enum HWResponse
{
None = 0x0,
Ready = 0x1,
Working = 0x2,
Error = 0x80,
}
Run Code Online (Sandbox Code Playgroud)
我喂它0x81,它应该为我提供一个IEnumerable<HWResponse>包含{Ready, Error}.
由于我没有找到更简单的方法,我尝试编写下面的代码,但我无法编译.
public static IEnumerable<T> MaskToList<T>(Enum mask)
{
if (typeof(T).IsSubclassOf(typeof(Enum)) == false)
throw new ArgumentException();
List<T> toreturn = new List<T>(100);
foreach(T curValueBit in Enum.GetValues(typeof (T)).Cast<T>())
{
Enum bit = ((Enum) curValueBit); // Here is the error
if (mask.HasFlag(bit))
toreturn.Add(curValueBit);
}
return toreturn;
}
Run Code Online (Sandbox Code Playgroud)
在这个版本的代码中,编译器抱怨它无法将T强制转换为Enum.
我做错了什么?有更好(更简单)的方法吗?我怎么能演员?
另外,我试着把方法写成
public static IEnumerable<T> MaskToList<T>(Enum mask) where T:Enum
Run Code Online (Sandbox Code Playgroud)
但Enum属于一种禁止'where'语法的特殊类型(使用C#4.0)
在此页面上,我看到以下代码:
if ((attributes & FileAttributes.Hidden) == FileAttributes.Hidden)
Run Code Online (Sandbox Code Playgroud)
但我不明白为什么会这样.
为什么attributes & FileAttributes.Hidden)?实际上,单一检查有什么作用attributes?它检查它是否不为空?我有一种感觉,但我觉得很奇怪.随机而怪异.
鉴于以下标志,
[Flags]
public enum Operations
{
add = 1,
subtract = 2,
multiply = 4,
divide = 8,
eval = 16,
}
Run Code Online (Sandbox Code Playgroud)
如何实现IF条件来执行每个操作?在我的尝试中,第一个条件适用于add,eval,这是正确的.然而,第一个条件也适用于减法,eval,这是不正确的.
public double Evaluate(double input)
{
if ((operation & (Operations.add & Operations.eval)) == (Operations.add & Operations.eval))
currentResult += input;
else if ((operation & (Operations.subtract & Operations.eval)) == (Operations.subtract & Operations.eval))
currentResult -= input;
else
currentResult = input;
operation = null;
return currentResult;
}
Run Code Online (Sandbox Code Playgroud)
我看不出是什么问题.
位标志有点难以理解:)
我知道这个和这个问题,我确实理解答案,我甚至从我的一个好朋友那里听过这篇文章.
但是当我需要"渐进"超过标准时,我仍然无法弄明白......
我想要做的是这样的:
if (HttpContext.Current.Session["DebugSessionText"] != null)
{
showType = parDebug.Write2LogType.WARN |
parDebug.Write2LogType.ERROR |
parDebug.Write2LogType.INFO;
if (!chkInfo.Checked)
showType &= ~parDebug.Write2LogType.INFO; // remove INFOs
if (!chkError.Checked)
showType &= ~parDebug.Write2LogType.ERROR; // remove ERRORs
List<myDebugRow> list =
(List<myDebugRow>)HttpContext.Current.Session["DebugSessionText"];
gv.DataSource = list.FindAll(x => x.Type == showType));
}
gv.DataBind();
Run Code Online (Sandbox Code Playgroud)
我确实需要过滤一个List对象,所以我可以得到用户想要的东西(仅显示INFO错误,异常错误,但始终会显示WARNing错误)...
有没有直接的方法来做到这一点,或者我需要手动过滤它而不使用LAMBDA表达式?
谢谢你的帮助.