使用string.CompareTo(字符串)我可以稍微解决这个问题,但不容易阅读,我已阅读过locallity设置可能会影响结果。
有没有办法简单地使用<或者>在2个字符串上以更直接的方式?
答案 0 :(得分:3)
您可以重载运算符,但很少应该这样。对我来说"stringA" > "stringB"
并不意味着该死的东西,它对IMO的可读性没有帮助。这就是为什么运算符重载指南建议如果含义不明显,不要重载运算符。
编辑:Operator Overloading Usage Guidelines
另外,在String
的情况下,我担心你不能看到它,因为你只能在定义方法的类中放置运算符重载方法。
如果CompareTo
的语法困扰你,可能将它包装在扩展方法中会解决你的问题吗?
就像那样:
public static bool IsLessThan(this string str, string str2) {
return str.Compare(str2) < 0;
}
我仍然觉得这对读者来说很困惑。
最重要的是,您不能为String
重载运算符。通常你可以做一些事情,比如声明一个部分并填充你的重载,但是String
是一个密封的类,所以不是这次。我认为合理名称的扩展方法是您最好的选择。您可以在其中放置CompareTo
或一些自定义逻辑。
答案 1 :(得分:2)
在我看来,CompareTo是正确的方法,您可以使用重载来指定特定于文化的参数......
答案 2 :(得分:2)
您在评论中提到您正在将两个字符串与“A100”和“B001”形式的值进行比较。由于VB 6实现字符串比较的方式,这适用于使用<
和>
运算符的旧版VB 6代码。
算法非常简单。它遍历字符串,一次一个字符,并比较每个字符的ASCII值。一旦发现一个字符串中的字符的ASCII码低于另一个字符串中的相应字符,则比较停止并且第一个字符串被声明为“小于”第二个字符串。 (通过将Option Compare Text
语句放在左上角,可以强制VB 6根据系统的当前语言环境执行不区分大小写的比较
相关的代码模块,但这是不的默认设置。)
当然很简单,但不完全是逻辑。比较ASCII值会跳过你现在可能在字符串中找到的各种有趣的东西;即非ASCII字符。由于您似乎正在处理其内容具有预定义限制的字符串,因此在您的特定情况下这可能不是问题。但更一般地说,编写像strA < strB
这样的代码对任何需要维护代码的人来说都是完全无稽之谈(看起来你已经拥有这种体验),而我鼓励你做“正确的事情”,即使你正在处理一组固定的输入。
在字符串值上使用<
或>
没有“直截了当”的说法。如果您需要实现此功能,则必须自己完成。按照我在上面使用VB 6描述的算法,您可以编写自己的比较函数并在代码中调用它。遍历字符串中的每个字符,确定它是字符还是数字,并将其转换为适当的数据类型。从那里,您可以比较两个已解析的值,并转到字符串中的下一个索引或返回“相等”值。
答案 3 :(得分:1)
我认为还有另一个问题:
Assert.IsFalse(10 < 2);
Assert.IsTrue("10" < "2");
(第二个Assert假设您对字符串类的<
运算符执行了重载。)
但是运营商否则建议!!
我同意Dyppl:你不应该这样做!