代码之家  ›  专栏  ›  技术社区  ›  Xaisoft

如果我不知道一个字符串是如何翻转的,如何确定它是否在两个字符串内?

c#
  •  0
  • Xaisoft  · 技术社区  · 14 年前

    很容易看出G在A和Z之间,但是如果我有一个用户输入序列号的范围 56AAA7105A25 56AAA71064D6 ,如何确定另一个序列号或范围是否介于之前指定的两个序列号之间。为了让我知道它是否在他们之间,我不需要知道它是如何滚动的。我面临的问题是,根据代码(在本例中为c),一个值将被视为大于和小于我指定的两个值,但是根据用户,他们输入的值实际上超出了范围。我该如何处理这种情况?

    7 回复  |  直到 14 年前
        1
  •  1
  •   Ben    14 年前

    所以你的序列号可以订购-你需要知道制造商使用什么算法。接下来要做的是使用该算法定义 IComparer<string> 这将比较两个序列号来封装该逻辑-您将得到类似的结果:

    public class SerialComparer : IComparer<T>
    {
        public int Compare(string x, string y)
        {
            // If x == y:
            //   return 0
            // If x > y:
            //   return 1
            // Else:
            //   return -1
        }
    }
    
    public static void Main(string[] args)
    {
    
       var x = "56AAA7105A25"; 
       var y = "56AAA71064D6";
       var comparer = new SerialComparer();
    
       if (comparer.Compare(x, y) > 0)
       {
           Console.WriteLine("{0} is greater than {1}", x, y);
       }
       else
       {
           Console.WriteLine("{0} is not greater than {1}", x, y);
       }
    }
    
        2
  •  1
  •   Chris    14 年前

    如果你不知道决定顺序的算法,那么你需要找到它。你可以尝试猜测,但从长远来看,这可能会导致痛苦,因为算法不需要简单。

    一旦知道了这个算法,就可以对它进行编码,然后下一步显然是非常简单的。关键是试图定义我们无法帮助的比较,因为我们也不知道它是什么。:)

        3
  •  1
  •   Sathyajith Bhat ron tornambe    11 年前

    假设这些是十六进制数,您应该能够将它们转换为长的(对于32位整数来说,它们太大了,48位)

    long.Parse("0x" + serialnumber);
    

    < > 运算符,如果输入了已知的无效值,则引发异常。

        4
  •  0
  •   joni    14 年前

    您可以将序列号转换为int,然后检查一个序列号是否在其他序列号之间。如果序列号只是十六进制数,这一点也不难,如果它们由整个字母表组成,你只需要建立一个函数,将给定基数(0-9+a-Z应该是25)的数字转换为int。只需将a-Z看作值为10-25的数字。

        5
  •  0
  •   arx    14 年前

    对。你需要知道序列号是如何定义的。如果你不知道两个序列号是如何比较的,那么你的代码也无法正确地进行比较。

        6
  •  0
  •   joni    14 年前

    只需从左到右浏览数字(别忘了用零填充所有数字到相同的长度),然后比较这个位置上的两个数字/字母。如果它们不同,你可以打破循环。

        7
  •  0
  •   as-cii    14 年前

    像这样的怎么样?

    class Program
        {
            static void Main(string[] args)
            {
                SerialNumber first = new SerialNumber("56AAA7105A25");
                SerialNumber second = new SerialNumber("57AAA71064C6");
                SerialNumber third = new SerialNumber("58AAA71064D6");
    
                Console.WriteLine(first.CompareTo(second));
                Console.WriteLine(second.CompareTo(third));
    
                Console.ReadLine();
            }
        }
    
        struct SerialNumber : IComparable<SerialNumber>
        {
            public string Serial { get; set; }
    
    
            public SerialNumber(string serial) : this()
            {
                this.Serial = serial;
            }
    
            public int CompareTo(SerialNumber other)
            {
                int compareTo = 0;
    
                using (CharEnumerator enum1 = Serial.GetEnumerator())
                using (CharEnumerator enum2 = other.Serial.GetEnumerator())
                {
                    while (enum1.MoveNext() && enum2.MoveNext())
                    {
                        if (enum1.Current != enum2.Current)
                        {
                            compareTo = enum1.Current.CompareTo(enum2.Current);
                            break;
                        }
                    }
                }
    
                return compareTo;
            }
        }