我有一种情况,我有一个业务对象,有大约15种不同类型的属性.业务对象还必须实现具有以下方法的接口:
object GetFieldValue(string FieldName);
Run Code Online (Sandbox Code Playgroud)
我可以看到实现此方法的两种方法:
使用switch语句:
switch ( FieldName )
{
case "Field1": return this.Field1;
case "Field2": return this.Field2;
// etc.
}
Run Code Online (Sandbox Code Playgroud)
使用字典(SortedDictionary或HashTable?):
return this.AllFields[FieldName];
Run Code Online (Sandbox Code Playgroud)
哪个会更有效率?
补充:忘了说.此方法用于在网格中显示项目.网格将为每个属性都有一列.通常会有超过1000个项目的网格.这就是为什么我关注性能.
新增2:
这是一个想法:混合方法.创建一个静态字典,其中键是属性名称,值是数组中的索引.在应用程序启动时,字典仅填充一次.每个对象实例都有一个数组.所以,查找将是:
return this.ValueArray[StaticDictionary[FieldName]];
Run Code Online (Sandbox Code Playgroud)
字典填充算法可以使用反射.然后将相应地实现属性本身:
public bool Field1
{
get
{
object o = this.ValueArray[StaticDictionary["Field1"]];
return o == null ? false : (bool)o;
}
set
{
this.ValueArray[StaticDictionary["Field1"]] = value;
}
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以看到这个问题吗?
它也可以更进一步,ValueArray/StaticDictionary可以放在一个单独的泛型类型中ValueCollection<T>,其中T将指定反射的类型.ValueCollection还将处理尚未设置任何值的情况.然后可以将属性简单地写为:
public bool Field1
{
get
{
return (bool)this.Values["Field1"];
}
set
{
this.Values["Field1"] = value;
} …Run Code Online (Sandbox Code Playgroud) 我必须将我的if语句设置为
if(Test == "test1" || Test == "test2" || Test == "test3")
{
//do something
}
Run Code Online (Sandbox Code Playgroud)
有没有办法有类似的东西
if(Test == "test1":"test2":"test3")
Run Code Online (Sandbox Code Playgroud) 下面是开关盒
switch (strID)
{
case ConfigurationManager.AppSettings["Key1"].ToString():
Label1.Visible = true;
break;
case ConfigurationManager.AppSettings["Key2"].ToString():
Label2.Visible = true;
break;
case ConfigurationManager.AppSettings["Key3"].ToString():
Label3.Visible = true;
break;
default:
Label1.Visible = true;
break;
}
Run Code Online (Sandbox Code Playgroud)
但它给出了错误“期望一个常数值”。
我知道 switch 语句中不能有变量。但是有什么办法吗?
这个问题是怎么样的一个附加到这个的问题
在C#中,交换机案例无法通过其他情况,这会导致编译错误.在这种情况下,我只是在所选月份和之后的每个月的总月份中添加一些数字.(简单的例子,并不意味着真实)
switch (month)
{
case 0:
add something to month totals
case 1:
add something to month totals
case 2:
add something to month totals
default:
break;
}
Run Code Online (Sandbox Code Playgroud)
在C#中是否有一个合乎逻辑的替代方案而不必写出大量的if语句?
if (month <= 0)
add something to month
if (month <= 1)
add something to month
if (month <= 2)
add something to month
.... etc
Run Code Online (Sandbox Code Playgroud) 据我了解,C# 编译器目前不允许像这样切换类型
switch (typeof(MyObj))
case Type1:
case Type2:
case Type3:
Run Code Online (Sandbox Code Playgroud)
有一些解决方案可以使用类型和操作字典或静态类(链接),但我只是很好奇,为什么这是一个不好的做法或尚未在编译器中实现?
先感谢您。
C#的switch语句可以编译为CIL开关指令,或if/else,这取决于此处提到的语句中的情况.有没有办法强制编译器始终在代码块中生成if/else变体?
我正在浏览我的图书馆的一位朋友,因为他询问了优化问题,我遇到了一段代码,如下所示:
long digit = 0;
switch (word) {
case "zero":
digit = 0;
break;
case "a":
case "one":
digit = 1;
break;
case "two":
digit = 2;
break;
case "three":
digit = 3;
break;
case "four":
digit = 4;
break;
case "five":
digit = 5;
break;
case "six":
digit = 6;
break;
case "seven":
digit = 7;
break;
case "eight":
digit = 8;
break;
case "nine":
digit = 9;
break;
case "ten":
digit = 10;
break;
case "eleven":
digit = …Run Code Online (Sandbox Code Playgroud) 我正在为Visual Studio C#控制台中的课程编写文本冒险,并决定使用switch语句而不是if-elses链,因为goto情况有多么有用(到目前为止它已经非常有效).我知道交换机本身的每个案例都必须是一个常量,但我想知道这是否也扩展到使用goto情况.例如,我有:
switch (location)
{
case 1:
break;
case 2:
break;
case 3:
break;
//I have 10 cases, each representing a location such as "Orc Cave", I just cut it down for brevity
default:
break;
}
Run Code Online (Sandbox Code Playgroud)
我希望能够输入一个整数变量,然后转到该整数,我有以下内容来完成:
string travel2 = Console.ReadLine();//inputs a integer representing each location
int travel2A = Convert.ToInt32(travel2);
if (1<=travel2A && travel2A<=10)
{
goto case(travel2A);
}
else{
goto case(2);//current location
}
Run Code Online (Sandbox Code Playgroud)
一切正常,但有一个"预期值不变"的警告(travel2A).是否可以通过一些调整使goto case输入变量,或者只是switch语句的限制?如果是后者,我可以做一个if-elses链,但在我看来,输入变量更方便.非常感谢任何帮助!谢谢!
什么是C#语言中的Java等效方法"getSource()"
public void actionPerformed(ActionEvent e)
{
if(e.getSource().equals(button1)){
//some code here
}
}
Run Code Online (Sandbox Code Playgroud) 我写了一些像这样的if-else语句:
if (workedDays > 0 && workedDays <= 180)
{
x= 14;
}
if (workedDays > 180 && workedDays <= 540)
{
x= 28;
}
if (workedDays > 540 && workedDays <= 1068)
{
x= 42;
}
else
{
x= 56;
}
Run Code Online (Sandbox Code Playgroud)
我试图将其重写为如下所示的switch语句:
switch (workedDays)
{
case (workedDays > 0 && workedDays <= 180):
x=14;
break;
default:
break;
}
Run Code Online (Sandbox Code Playgroud)
但是,我收到了错误Cannot implicitly convert type 'bool' to 'int'.
我该如何解决?
我想在c sharp中做这样的事情:
int i = 0;
foreach ( Item item in _Items )
{
foreach (Field theField in doc.Form.Fields)
{
switch (theField.Name)
{
case "Num" + i++.ToString(): // Number of Packages
theField.Value = string.Empty;
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我有20个左右的字段,名为Num1,Num2等.如果我可以在一个语句/块中完成所有这些,我宁愿这样做.
但编译器抱怨case语句需要是常量值.有没有办法在case语句中使用动态变量,这样我可以避免重复代码?
我只是想提一下,这个方法的目的是填充PDF格式的字段,使用我无法控制的命名约定.有20行字段,名称如"Num1" - "Num20".这就是字符串连接在我的场景中有用的原因.
这里筋疲力尽的菜鸟.我基本上有2个问题......
很抱歉澄清交换机在一个循环中,它获取了一堆数字,然后使用OrderByDescending()对它们进行排序.我的问题是现在我不知道有哪些数字,我只知道它们是按降序排序的.现在我优先考虑一些特定数字对我来说比其他数字更重要(背后没有规则或逻辑).但另一方面,我所寻找的数字中没有一个可能在里面,所以作为一个"默认"返回或者在集合中有最高数字的工作.
1:是开关案例顺序敏感?假设我打开1到5的范围,对我来说4优先级高于剩下的那个按预期工作?
switch(number)
{
case 4: DoFancyStuff(); break;
case 3: NotTooFancy(); break;
case 1: StillOk(); break;
case 2: Bad(); break;
case 5: SuperBad(); break;
default:break;
}
Run Code Online (Sandbox Code Playgroud)
无论如何,进一步假设数字按降序排序.但我现在不知道可能的范围number,它可能是2,4,8,16等等,但可能缺少一些数字:2,4,16 ......
所以,如果我不得不说
switch(number)
{
case 32: Nice(); break;
case 64: OkToo(); break;
case 128: Nah(); break;
case 8: OkStillTakeIt(); break;
default: break;
}
Run Code Online (Sandbox Code Playgroud)
因此,当数字按降序排列时,大数字首先出现,但它们没有最高优先级,可能有一个数字与最高(优先)一个(第一种情况),但它也没有...如果没有人适合我想要拿最高的一个,但那是"迷失".
我该如何解决这个问题?或者我只是过度思考?错误的做法?我的大脑从思考它开始爆炸.
c# ×11
.net ×2
clr ×1
constants ×1
dictionary ×1
goto ×1
if-statement ×1
java ×1
optimization ×1
web-config ×1