【问题标题】:String Comparison or Parse to Int?字符串比较或解析为 Int?
【发布时间】:2014-04-03 16:58:09
【问题描述】:

我会尽量简短。我正在编写一个模块,它需要比较两个作为字符串输入的大整数(注意:它们很大,但不足以超过 Int64 边界)。

字符串被填充,因此选择是采取额外步骤将它们转换为等效的整数还是将它们作为字符串进行比较。

我正在做的是将它们中的每一个转换为 Int64 并以这种方式进行比较。但是,我相信字符串比较也可以。看到我希望它尽可能高效,您对通过以下方式比较整数有什么看法:

string integer1 = "123";
string integer2 = "456";

if (Int64.Parse(integer1) <= Int64.Parse(integer2))

string integer1 = "123";
string integer2 = "456";

if (integer1.CompareTo(integer2) < 0)

【问题讨论】:

  • 什么?是什么让您认为比较字符串比简单的纯整数比较更快?
  • 不是一个意见问题,字符串比较只是不适合这个。

标签: c# string comparison


【解决方案1】:

不,字符串比较不起作用。您应该使用您的第一个版本,您必须将此字符串转换为解析它们的数字,然后比较数字。

看看here 会很好,其中详细解释了CompareTo 方法的作用。简而言之:

当前实例与另一个相同类型的对象进行比较,并返回一个整数,指示当前实例在排序顺序中是在另一个对象之前、之后还是出现在相同位置。

因此,由于“123”和“456”是字符串,它们将一个字符串与另一个字符串进行比较,而不是将一个整数与另一个进行比较。

最后但同样重要的是,最好使用TryParse 方法来解析您的数字,因为您的输入可能不是意外的整数。您使用它的方式相当简单:

Int64 value = 0;
Int64.Parse(integer1, out value1);

value1 是字符串integer1 转换后得到的值1。所以对于你们双方的价值观,你应该使用这个if 声明:

if(Int64.TryParse(integer1, out value1) && Int64.TryParse(integer2, out value2)
{
    if(value1<=value2)
    {

    }
    else
    {

    }
}
else
{
    // Some error would have been happened to at least one of the two conversions.
}

【讨论】:

  • @ChristosPaisios:你怎么能做类似Int64.Parse(integer1, out value1);的事情??应该是Int64.TryParse(integer1, out value1);!!那是两个different 的东西
  • @huMptyduMpty 哎呀……我忘了。谢谢你让我知道!
【解决方案2】:

最好使用Int64.TryParse,因为这是一个字符串字段

string integer1 = "123";
string integer2 = "456";

long value1=0;
long value2=0;

long.TryParse(integer1 ,out value1); 
long.TryParse(integer2 ,out value2);

if(value1<=value2)

【讨论】:

    【解决方案3】:

    值得质疑是否值得转换(解析)成本。如果 String.CompareTo 真的很有效,并且数字总是具有比例和格式*,那么字符串比较是可靠的,那么你可能会更好。您可以测量性能,但您会发现 convert 和 int 比较比字符串比较更快、更健壮。

    *如果数字字符串的长度相等,并且必要时带有前导 0,则字符串比较有效。所以'003'、'020'和'100'会正确排序,但'3'、'20'和'100'不会。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-25
      • 2021-08-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多