相关疑难解决方法(0)

.NET:用于字符串键的切换与字典

我有一种情况,我有一个业务对象,有大约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)

.net dictionary switch-statement

11
推荐指数
2
解决办法
5002
查看次数

我可以有这样的if语句吗?如果Test ="test1"或"test2"或"test3"而没有走很长的路?

我必须将我的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)

c#

9
推荐指数
3
解决办法
771
查看次数

如何在没有 if 的情况下在 C# 中的 switch case 中使用 web.config 值,否则循环“需要一个常量值”。

下面是开关盒

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# web-config constants switch-statement

6
推荐指数
1
解决办法
2299
查看次数

C#开关:案件没有落到其他案件限制

这个问题是怎么样的一个附加到这个的问题

在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-statement

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

是什么阻止 C# 编译器在“Type”上实现“Switch”语句?

据我了解,C# 编译器目前不允许像这样切换类型

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

有一些解决方案可以使用类型和操作字典或静态类(链接),但我只是很好奇,为什么这是一个不好的做法或尚未在编译器中实现?

先感谢您。

.net c# compiler-optimization

5
推荐指数
1
解决办法
353
查看次数

如何阻止C#的switch语句生成CIL开关指令

C#的switch语句可以编译为CIL开关指令,或if/else,这取决于此处提到的语句中的情况.有没有办法强制编译器始终在代码块中生成if/else变体?

c# clr switch-statement

4
推荐指数
1
解决办法
2168
查看次数

是否可以优化字符串上的大型开关?

我正在浏览我的图书馆的一位朋友,因为他询问了优化问题,我遇到了一段代码,如下所示:

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)

c# optimization

4
推荐指数
2
解决办法
922
查看次数

使用goto case(变量); 在C#开关

我正在为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# goto switch-statement

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

使用EventArgs

什么是C#语言中的Java等效方法"getSource()"

public void actionPerformed(ActionEvent e) 
{ 
   if(e.getSource().equals(button1)){
      //some code here
     }
}
Run Code Online (Sandbox Code Playgroud)

c# java

2
推荐指数
1
解决办法
839
查看次数

重写if else进入switch

我写了一些像这样的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# if-statement switch-statement

1
推荐指数
1
解决办法
1542
查看次数

Switch中case语句中的非静态/常量值

我想在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".这就是字符串连接在我的场景中有用的原因.

c#

0
推荐指数
1
解决办法
5904
查看次数

切换整数优先级的大小写

这里筋疲力尽的菜鸟.我基本上有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#

-2
推荐指数
1
解决办法
475
查看次数