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

时间:2012-01-20 17:40:05

标签: c#

我想在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;
        }
    }
}

我有20个左右的字段,名为Num1,Num2等。如果我可以在一个语句/块中完成所有操作,我宁愿这样做。

但是编译器抱怨case语句需要是常量值。有没有办法在case语句中使用动态变量,这样我可以避免重复代码?

我只是想提一下,这个方法的目的是填充PDF格式的字段,使用我无法控制的命名约定。有20行字段,名称如“Num1” - “Num20”。这就是字符串连接在我的场景中有用的原因。

6 个答案:

答案 0 :(得分:10)

没有。这只是语言的一部分。如果值不是常量,则必须使用if / else if或类似的解决方案。 (如果我们了解您要实现的目标的更多细节,我们可能会提供有关解决方案的更多详细信息。)

从根本上说,我会质疑一个设计,它具有这样的字段的命名约定 - 听起来真的应该有一个集合开始,这更容易使用。

答案 1 :(得分:1)

是的,必须能够在编译时评估案例值。怎么样呢

foreach (Field theField in doc.Form.Fields)
{
    if(theField.Name == ("Num" + i++))
    {
        theField.Value = string.Empty;
    }
}

答案 2 :(得分:0)

怎么样:

int i = 0;
foreach ( Item item in _Items )
    doc.Form.Fields.First(f=>f.Name == "Num" + i++.ToString()).Value = string.Empty;

不确定代码的用途是什么。

答案 3 :(得分:0)

没有。没有办法。

如何用以下方法更换开关:

if (theField.Name.StartsWith("Num"))
  theField.Value = string.Empty;

或某些类似的测试?

答案 4 :(得分:0)

var matchingFields =
    from item in _Items
    join field in doc.Form.Fields
      on "Num" + item.PackageCount equals field.Name
    select field;

foreach (var field in matchingFields)
{
    field.Value = string.Empty;
}

为获得更高的效率,请在获取匹配字段后从字段名称中选择DistinctBy(来自MoreLINQ或等效字段)。

答案 5 :(得分:0)

还要考虑每次将两个或多个字符串连接在一起时,编译器将为每个组件字符串创建内存变量,然后为最终字符串创建另一个字符串。这是内存密集型的,对于非常大的字符串,如错误报告,它甚至可能是性能问题,并且还可能导致程序运行中的内存碎片,对于长时间运行的程序。在这种情况下可能不是那么多,但将这些最佳实践发展到您通常的开发程序中是很好的。

所以不要这样写:

"Num" + i++.ToString()

考虑这样写:

string.Format("{0}{1}", "Num", i++.ToString());

另外,您可能需要考虑将“Num”之类的字符串放入单独的常量类中。代码中包含字符串常量会导致程序僵化,并随着程序的增长而限制程序的灵活性。

所以你可能在程序开头就有这样的东西:

using SysConst = MyNamespace.Constants.SystemConstants;

然后你的代码看起来像这样:

string.Format("{0}{1}", SysConst.Num, i++.ToString());

在你的SystemConstants类中,你会有这样的东西:

/// <summary>System Constants</summary>
public static class SystemConstants
{
    /// <summary>The Num string.</summary>
    public static readonly string Num = @"Num";
}

如果您需要在程序中的任何其他位置使用“Num”字符串,那么您可以使用'SysConst.Num'

此外,每当您决定将“Num”更改为“Number”时,也就是说根据客户请求,您只需要在一个地方更改它,而不是在您的系统中进行大量的替换。

相关问题