相关疑难解决方法(0)

C#开启类型

可能重复:
C# - "开启类型"有比这更好的选择吗?

C#不支持切换对象的类型.模拟这个的最佳模式是什么:

switch (typeof(MyObj))
    case Type1:
    case Type2:
    case Type3:
Run Code Online (Sandbox Code Playgroud)

谢谢!

c#

163
推荐指数
3
解决办法
17万
查看次数

如何使C#Switch语句使用IgnoreCase

如果我有一个switch-case语句,其中switch中的对象是字符串,是否可以进行ignoreCase比较?

我有例如:

string s = "house";
switch (s)
{
  case "houSe": s = "window";
}
Run Code Online (Sandbox Code Playgroud)

将获得价值"窗口".如何覆盖switch-case语句,以便使用ignoreCase比较字符串?

c# switch-statement

73
推荐指数
8
解决办法
6万
查看次数

在C#中切换案例 - 预期是一个常量值

我的代码如下:

public static void Output<T>(IEnumerable<T> dataSource) where T : class
{   
    dataSourceName = (typeof(T).Name);
    switch (dataSourceName)
    {
        case (string)typeof(CustomerDetails).Name.ToString(); :
            var t = 123;
            break;
        default:
            Console.WriteLine("Test");
    }
}
Run Code Online (Sandbox Code Playgroud)

但这不起作用.case语句给出了一个错误,说明了一个常量变量.请大家帮忙谢谢!

c# switch-statement

50
推荐指数
6
解决办法
13万
查看次数

在一个开关vs字典中的Func值,这更快,为什么?

假设有以下代码:

private static int DoSwitch(string arg)
{
    switch (arg)
    {
        case "a": return 0;
        case "b": return 1;
        case "c": return 2;
        case "d": return 3;
    }
    return -1;
}

private static Dictionary<string, Func<int>> dict = new Dictionary<string, Func<int>>
    {
        {"a", () => 0 },
        {"b", () => 1 },
        {"c", () => 2 },
        {"d", () => 3 },
    };

private static int DoDictionary(string arg)
{
    return dict[arg]();
}
Run Code Online (Sandbox Code Playgroud)

通过迭代这两种方法并进行比较,即使"a","b","c","d"扩展为包含更多键,我也会得到字典稍快一些.为什么会这样?

这与圈复杂度有关吗?是因为抖动只将字典中的return语句编译为本机代码一次?是因为字典的查找是O(1),这可能不是switch语句的情况?(这些只是猜测)

c# clr dictionary cyclomatic-complexity switch-statement

43
推荐指数
3
解决办法
2万
查看次数

你会如何尽可能快地制作这个切换声明?

2009-12-04更新:有关在此处发布的一些建议的分析结果,请参阅下文!


问题

考虑以下非常无害,非常简单的方法,它使用switch语句返回定义的枚举值:

public static MarketDataExchange GetMarketDataExchange(string ActivCode) {
    if (ActivCode == null) return MarketDataExchange.NONE;

    switch (ActivCode) {
        case "": return MarketDataExchange.NBBO;
        case "A": return MarketDataExchange.AMEX;
        case "B": return MarketDataExchange.BSE;
        case "BT": return MarketDataExchange.BATS;
        case "C": return MarketDataExchange.NSE;
        case "MW": return MarketDataExchange.CHX;
        case "N": return MarketDataExchange.NYSE;
        case "PA": return MarketDataExchange.ARCA;
        case "Q": return MarketDataExchange.NASDAQ;
        case "QD": return MarketDataExchange.NASDAQ_ADF;
        case "W": return MarketDataExchange.CBOE;
        case "X": return MarketDataExchange.PHLX;
        case "Y": return MarketDataExchange.DIRECTEDGE;
    }

    return MarketDataExchange.NONE;
}
Run Code Online (Sandbox Code Playgroud)

我和我的同事今天就如何更快地实现这个方法的几个想法进行了斗争,并且我们想出了一些有趣的修改,实际上相当显着地提高了它的性能(当然,按比例说).我有兴趣知道那里的其他人可以想到哪种优化可能没有发生在我们身上.

接下来,让我简单地提供一个快速免责声明:这是为了好玩 …

c# optimization switch-statement

33
推荐指数
6
解决办法
4531
查看次数

"switch"语句评估线程安全吗?

请考虑以下示例代码:

class MyClass
{
    public long x;

    public void DoWork()
    {
        switch (x)
        {
            case 0xFF00000000L:
                // do whatever...
                break;

            case 0xFFL:
                // do whatever...
                break;

            default:
                //notify that something going wrong
                throw new Exception();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

忘掉片段的无用性:我的疑问是关于switch声明的行为.

假设该x字段只能有两个值:0xFF00000000L0xFFL.上面的开关不应该属于"默认"选项.

现在想象一个线程正在执行"x"等于0xFFL的开关,因此第一个条件将不匹配.同时,另一个线程将"x"变量修改为0xFF00000000L.我们知道64位操作不是原子操作,因此变量首先将较低的dword置零,然后将较低的dword置零(反之亦然).

如果在"x"为零时(即在新的分配期间)完成开关中的第二个条件,我们是否会陷入不希望的"默认"情况?

c# thread-safety switch-statement atomicity

25
推荐指数
2
解决办法
2107
查看次数

C#中的switch语句和"预期的常量值"

为什么编译器会说"第一种情况需要一个常量值"......第二种情况正常......

switch (definingGroup)
{
    case Properties.Settings.Default.OU_HomeOffice:  
        //do something  
        break;
    case "OU=Home Office":  
        //do something
        break;
    default:
        break;
 }
Run Code Online (Sandbox Code Playgroud)

还试过......

switch (definingGroup)
{
    case Properties.Settings.Default.OU_HomeOffice.ToString():  
        //do something
        break;
    case "OU=Home Office":
        //do something
        break;
    default:
        break;
 }
Run Code Online (Sandbox Code Playgroud)

......同样的错误

这是Properties.Setting代码

[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("OU=Home Office")]
public string OU_HomeOffice {
    get {
        return ((string)(this["OU_HomeOffice"]));
    }
}
Run Code Online (Sandbox Code Playgroud)

c# visual-studio

20
推荐指数
3
解决办法
3万
查看次数

在switch语句中切换语句?

我必须评估许多条件.就我而言,我必须做这样的事情:

switch(id)
{
    case 5:
         // switch some other cases here
    case 6:
         // set some value
    ...
 }
Run Code Online (Sandbox Code Playgroud)

在案例5中有另一个开关是好的做法吗?如果没有,有什么更好的?在if那里发表声明?

c# switch-statement

20
推荐指数
6
解决办法
4万
查看次数

在c#中的开关中使用'is'关键字

我目前正在为此代码添加一些新的扩展类:

foreach (BaseType b in CollectionOfExtendedTypes) {
  if (b is ExtendedType1) {
    ((ExtendedType1) b).foo = this;

  }
  else if (b is ExtendedType2) {
    ((ExtenedType2) b).foo = this;

  } 
  else {
    b.foo = this;

  }
}
Run Code Online (Sandbox Code Playgroud)

并且好奇是否有办法is在switch语句中使用关键字功能?

c# switch-statement

17
推荐指数
3
解决办法
1万
查看次数

为什么C#switch语句不允许使用typeof/GetType()?

如下例所示:

switch ( myObj.GetType ( ) )
{
    case typeof(MyObject):
        Console.WriteLine ( "MyObject is here" );
        break;
}
Run Code Online (Sandbox Code Playgroud)

.net c# reflection switch-statement

13
推荐指数
5
解决办法
2万
查看次数