2011-08-04 14 views
1

我在构建一个好的算法时遇到了一些麻烦。这是我的标准:我正在读取xml文件中的一个字段作为字符串,并尝试解释它以激活一些gui组件。更具体地说,我以字符串形式读取的字段是“允许的字符”字段,gui组件是根据字段内容激活的复选框。例如,在XML我有标签解释字段类型以激活c中的复选框#

<Allowed Field>ABCDEFGHIJKLMNOPQRSTUVWXYZ</Allowed Fields>. 

当我在这个领域作为字符串读取,程序应该知道字段内容类型是ALPHA并勾选名为阿尔法。同样,如果该字段包含字母数字内容或任何特殊字符。我有三个算法应该解释的复选框:Alpha,字母数字和特殊字符。我如何构建算法来解释从xml中读取的字符串的含义,以表示所提到的字段类型?

感谢

+1

我已经尝试过一个string.contains。举例来说,如果一个if语句通过检查它是否具有A并且不包含0,但这种方式效率不高 – Joe

+0

是的,这不是。但你应该已经发布了一些代码,所以很明显你做了一些努力。请看我的回复。 –

回答

1
static FieldKind AnalyzeKind (string s) 
{ 
    bool hasNumbers, hasSpecial; 

    foreach (char c in s) { 
     if (Char.IsNumber (c)) 
      hasNumbers = true; 

     else if (!Char.IsLetter (c)) 
      return FieldKind.AlphaNumericWithSpecialCharacters; 
    } 

    return (hasNumbers) ? FieldKind.AlphaNumeric : FieldKind.Alpha; 
} 

其余取决于你定义为特殊字符(如什么是空白?标点符号?)。
Char方法供您参考。

+1

如果字符是数字,那么算法在第一个if语句之后不会中断,它将返回true,它不是第二个if语句中的字母,然后您将返回SpecialCharacters。你需要休息一下,如果还有第二个,如果还有其他的话。 –

+0

@Gweebz:感谢您发现这一点。我的错。我不想'打破',因为它可能仍然是一个特殊的角色,OP没有完全定义这种“特殊性”,所以我不能马上测试它。 –

+0

除了a-z和0-9之外,特殊字符基本上都是键盘上的其他任何字符。我认为你的方法会适合这种特殊情况吗? – Joe

2

这是正则表达式的另一种可能的应用。

static Regex isAlpha = new Regex("^[A-Za-z]+$"); 
static Regex isAlphaNumeric = new Regex("^[A-Za-z0-9]+$"); 

static FieldKind AnalyzeKind (string s) 
{ 
    if(isAlpha.IsMatch(s)) return FieldKind.Alpha; 
    if(isAlphaNumeric.IsMatch(s)) return FieldKind.AlphaNumeric; 
    return FieldKind.AlphaNumericWithSpecialCharacters; 
} 

如果你将要调用AnalyseKind很多程序,你可以通过在正则表达式的构造函数设置RegexOptions.Compiled加快它一点点。

+0

是的,可能是比我更清洁的解决方案。 –

+0

这肯定是正则表达式的合适用法。好方法! –

+0

根据“”计为Alpha,AlphaNumeric还是什么,您可能需要将正则表达式中的一个或多个“+”字符更改为“*”(即匹配0或更多,而不是匹配1或更多) 。 –

相关问题