-1

输入值可以是从 A 到 ZZZ(只有字母,没有数字字符)我如何验证 from 和 to 字段。

其中输入可以是 A 或 AA 或 AAA

  • 乙>甲
  • BB > A
  • BBB > 一个
  • BBB < B
  • BBB < BB
  • DD > C 但 D 应该是 < CC 失败,因为它不是字典顺序

我在考虑先检查长度,因为如果从长度小于到长度,那么它总是会更短。如果长度相等,则按字母顺序检查。然后我就解开了。

不是简单的字典顺序,因为三个可能的组 single、double、triple chars single group 低于 double 和 Triple group 以及 double 低于 Triple group 不仅仅是字母顺序。

4

4 回答 4

1

您是否考虑过使用正则表达式?\b[A-Z]{1,3}\b

于 2013-01-21T12:55:32.177 回答
0
string from = "BB";
string to = "AAA";
bool valid = string.Compare(from, to) < 0; // false

所以它已经按字典顺序工作。演示

于 2013-01-21T12:55:30.793 回答
0

您可以执行以下操作:将字符串 AAA 想象为一个数字,即 A*26^2 + A*26^1 + A*26^0

(以 26 为基数,因为有那么多字母)

拆分字符串,将值 A 到 Z 转换为 1 到 26(前面的空白 = 0),您就完成了:

 A = 0*26^2 + 0*26^1 + 1*26^0 => 1
 B = 2 => 2
 ...
 Z = 26 => 26
 AA = 1 * 26^1 + 1 => 27
 ...
 ZZ = 26*26^1 + 26 = 702
 ...
 ZZZ = 26*26^2 + 26*26^1 + 26 => 18278 

把它包起来

    public int LetterCodeToInt(String LetterCode)
    {
        //fill up whitespaces in front.
        String s = LetterCode.PadLeft(3, '_').ToUpper();

        int value = 0;
        int k = s.Length -1;
        for (int i = 0; i < s.Length; i++)
        {
            if (s[i] != '_')
            {
                //ASCII "A" is 65, subtract 64 to make it "1" 
                value += (((int)s[i]) - 64) * Convert.ToInt32(Math.Pow(26, k));
            }
            k--;
        }
        return value;
    }

你可以这样做:

 if (LetterCodeToInt("AAA") > LetterCodeToInt("AZ")){

 }
于 2013-01-21T13:01:31.597 回答
0

你在正确的轨道上。创建一个自定义比较器,首先检查长度。例如:

public class MyComparer : IComparer<string>
{
    public int Compare(string x, string y)
    {
        if (x.Length < y.Length) return -1;
        if (x.Length > y.Length) return 1;
        return Comparer.Default.Compare(x, y);
    }
}
于 2013-01-21T14:28:48.127 回答