字符串比较 ==,当它忽略空格时

本文关键字:空格 比较 字符串 | 更新日期: 2023-09-27 18:36:56

我在我的 asp.net mvc Web应用程序中有以下方法,以检查IP地址是否已存在:-

public bool ISTMSIPUnique(string ip, int? id=0) 
{
    var technology = FindTechnology(id.Value);
    var result = tms.TechnologyIPs.Where(a.IPAddress.ToUpper() == ip.ToUpper());
    return (result.Count() == 0);
}

但我注意到,a.IPAddress.ToUpper() == ip.ToUpper()将执行以下操作:

  1. 它将假定"测试"和"测试"是相同的。(它将忽略字符末尾的空格)。
  2. 但会假设"test"和"test",左右的空格是两个不同的字符串。

那么这背后的规则是什么?由于 IP 地址不能包含空格,我是否应该在将字符串保存到 SQL 服务器数据库之前始终修剪字符串以克服此问题?

字符串比较 ==,当它忽略空格时

由于您发布了这实际上是使用 EF 的详细信息,因此我关于字符串比较的评论无效。

假设您的数据库是 Sql Server 或任何符合 ANSI 字符串比较标准的数据库,则在比较之前,字符串将填充为相同的长度。因此,在比较字符串之前,通过附加空格字符,将"test"填充为与"test"相同的长度,因此它们的计算结果相等。相反,在比较"test"和"test"时,"test"被填充到"test"中,使其长度与"test"相同,这仍然导致字符串不能比较为等效的字符串。

http://support.microsoft.com/kb/316626

"test"和"test "肯定是不同的字符串。框架从不忽略空格。

我会将修剪后的字符串保存到数据库中。我也建议使用字符串。字符串比较的相等

顺便说一句,如果您正在使用IP地址,为什么需要调用ToUpper方法?

我建议阅读这篇文章。这是关于字符串实习生池的。http://msdn.microsoft.com/en-us/library/system.string.intern.aspx。非常有用!

公共语言运行库通过维护一个表(称为 intern 池)来节省字符串存储,该表包含对程序中以编程方式声明或创建的每个唯一文本字符串的单个引用。因此,具有特定值的文本字符串的实例在系统中仅存在一次。例如,如果将同一文本字符串分配给多个变量,则运行时将从实习生池中检索对文本字符串的相同引用,并将其分配给每个变量。

"test"和"test"肯定是不同的字符串

对于您的情况,我认为您需要在保存到数据库时清理 ip 地址,这样您就不需要每次清理 ip。

另外,我认为使用 String.Equals 与字符串进行比较也是一种很好的做法(您在那里有更多的控制权,例如是否忽略大小写......),如果您想清除空格或其他一些字符,请在传递给函数之前清理它。

string cleaned1 = clean your input
string cleaned2 = clean your input
bool stringEquals = String.Equals(
    cleaned1, 
    cleaned2, 
    StringComparison.OrdinalIgnoreCase);