可能重复:
C# - "开启类型"有比这更好的选择吗?
C#不支持切换对象的类型.模拟这个的最佳模式是什么:
switch (typeof(MyObj))
case Type1:
case Type2:
case Type3:
Run Code Online (Sandbox Code Playgroud)
谢谢!
如果我有一个switch-case语句,其中switch中的对象是字符串,是否可以进行ignoreCase比较?
我有例如:
string s = "house";
switch (s)
{
case "houSe": s = "window";
}
Run Code Online (Sandbox Code Playgroud)
将获得价值"窗口".如何覆盖switch-case语句,以便使用ignoreCase比较字符串?
我的代码如下:
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语句给出了一个错误,说明了一个常量变量.请大家帮忙谢谢!
假设有以下代码:
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语句的情况?(这些只是猜测)
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)
我和我的同事今天就如何更快地实现这个方法的几个想法进行了斗争,并且我们想出了一些有趣的修改,实际上相当显着地提高了它的性能(当然,按比例说).我有兴趣知道那里的其他人可以想到哪种优化可能没有发生在我们身上.
接下来,让我简单地提供一个快速免责声明:这是为了好玩 …
请考虑以下示例代码:
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字段只能有两个值:0xFF00000000L或0xFFL.上面的开关不应该属于"默认"选项.
现在想象一个线程正在执行"x"等于0xFFL的开关,因此第一个条件将不匹配.同时,另一个线程将"x"变量修改为0xFF00000000L.我们知道64位操作不是原子操作,因此变量首先将较低的dword置零,然后将较低的dword置零(反之亦然).
如果在"x"为零时(即在新的分配期间)完成开关中的第二个条件,我们是否会陷入不希望的"默认"情况?
为什么编译器会说"第一种情况需要一个常量值"......第二种情况正常......
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) 我必须评估许多条件.就我而言,我必须做这样的事情:
switch(id)
{
case 5:
// switch some other cases here
case 6:
// set some value
...
}
Run Code Online (Sandbox Code Playgroud)
在案例5中有另一个开关是好的做法吗?如果没有,有什么更好的?在if那里发表声明?
我目前正在为此代码添加一些新的扩展类:
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语句中使用关键字功能?
如下例所示:
switch ( myObj.GetType ( ) )
{
case typeof(MyObject):
Console.WriteLine ( "MyObject is here" );
break;
}
Run Code Online (Sandbox Code Playgroud)