C#字符串比较等于false
我有一个字符串比较问题,在大多数情况下,它的行为与预期的一样,但给我留下了大量重复的DB插入,因为我的代码没有检测到重复的字符串对 我以为我已经把它缩小到了一个文化问题(西里尔文字),我解决了这个问题,但现在我得到了“假否定”(两个明显相等的字符串显示为不相等) 我研究了以下类似的问题,并尝试了以下比较方法 类似于我检查过的问题:C#字符串比较等于false,c#,.net,string-comparison,C#,.net,String Comparison,我有一个字符串比较问题,在大多数情况下,它的行为与预期的一样,但给我留下了大量重复的DB插入,因为我的代码没有检测到重复的字符串对 我以为我已经把它缩小到了一个文化问题(西里尔文字),我解决了这个问题,但现在我得到了“假否定”(两个明显相等的字符串显示为不相等) 我研究了以下类似的问题,并尝试了以下比较方法 类似于我检查过的问题: 下面是一个比较字符串的示例:(标题和说明) 提要标题:埃尔斯伯格:他是个英雄 feed desc:丹尼尔·埃尔斯伯格告诉CNN的唐·莱蒙,国家安全局泄密者
文章
对象如下:
public class Article
{
public string Title;
public string Description;
}
更新:
我尝试过规范化字符串以及包含IgnoreSymbols
CompareOption,但仍然得到一个假阴性(不匹配)。然而我注意到的是,撇号似乎在虚假的非匹配中出现一致;所以我想这可能是撇号和单引号的对比,比如“vs”(等等),但是无知的符号应该避免吗
我发现了两个更相似的SO帖子:
下一步:根据以下答案尝试使用正则表达式去除空白:
更新2
在6次比较仍然没有得到匹配结果后,我意识到必须有另一个因素影响结果,所以我尝试了以下方法
//7
IEnumerable<Article> matches7 = thisFeedArticles.Where(b =>
Regex.Replace(b.Title, "[^0-9a-zA-Z]+", "").Equals(Regex.Replace(a.Title, "[^0-9a-zA-Z]+", ""), StringComparison.InvariantCultureIgnoreCase) &&
Regex.Replace(b.Description, "[^0-9a-zA-Z]+", "").Equals(Regex.Replace(a.Description, "[^0-9a-zA-Z]+", ""), StringComparison.InvariantCultureIgnoreCase)
);
/7
IEnumerable matches7=此提要。其中(b=>
Regex.Replace(b.Title,[^0-9a-zA-Z]+”).Equals(Regex.Replace(a.Title,[^0-9a-zA-Z]+”),StringComparison.InvariantCultureIgnoreCase)&&
Regex.Replace(b.Description,“[^0-9a-zA-Z]+”,”).Equals(Regex.Replace(a.Description,“[^0-9a-zA-Z]+”,”),StringComparison.InvariantCultureIgnoreCase)
);
这确实找到了其他人错过的匹配
下面的字符串通过了所有6个比较,但不是第7个:
a.Title.Trim().Normalize()
和a.Title.Trim()
都返回:
“勘误表:一种独特的TGF-β依赖性分子和蛋白质的鉴定。”
小胶质细胞的功能特征
数据库中的值为:
“勘误表:一种独特的TGF-ß依赖性分子和蛋白质的鉴定。”
小胶质细胞的功能特征
仔细检查表明,与feed中的“βvsß”相比,DB中的德语“eszett”字符有所不同
我本以为至少有一个比较1-6会发现这一点
有趣的是,经过一些性能比较后,Regex选项决不是七个选项中最慢的<代码>规范化似乎比正则表达式更加密集!
当thisFeedArticles
对象包含12077项时,以下是所有七项的Stopwatch
持续时间
经过的时间:00:00:00.0000662经过的时间:00:00:00.0000009
经过的时间:00:00:00.0000009
经过的时间:00:00:00.0000009
经过的时间:00:00:00.0000009
经过的时间:00:00:00.0000009
经过时间:00:00:00.0000016 Unicode字符串可以是“二进制”不同的,即使它们“语义”相同
尝试规范化字符串。有关更多信息,请参见如果这些字符串来自数据库,则可能需要了解数据库列的声明方式以及使用的排序规则。“但我现在得到的‘误报’(两个明显相等的字符串)显示为不相等。”这不是‘误报’吗?还要检查比较字符串的长度,也许他们包含了一些无形的字符,你也可以考虑归一化字符串,见Yea,我同意@ MattBurland。另外,您可以发布您遇到问题的实际字符串吗?如果将它们复制粘贴到文字中,比较是否仍然失败?数据中有隐藏的字符吗?不幸的是,在我的情况下,这并不是一个可靠的选择。见上文更新2。感谢所有这些经过更多测试后,您的第一条评论似乎是解决我问题的正确方法。在SSMS中,我运行了一个包含“α”(alpha)的查询,并且输出没有包含“α”,而是包含一个“a”。讨论中的列是varchar,将它们更改为nvarchar可能是必要的,但这是我一直担心的事情(10M+行…)dev db和prod db之间的排序规则也不同,这对测试/调试没有帮助。@AdamHey显然很好,特别是在处理西里尔字符时。这是我的第一个预感。但既然你没有反应,我想你已经有了答案。
public class Article
{
public string Title;
public string Description;
}
//7
IEnumerable<Article> matches7 = thisFeedArticles.Where(b =>
Regex.Replace(b.Title, "[^0-9a-zA-Z]+", "").Equals(Regex.Replace(a.Title, "[^0-9a-zA-Z]+", ""), StringComparison.InvariantCultureIgnoreCase) &&
Regex.Replace(b.Description, "[^0-9a-zA-Z]+", "").Equals(Regex.Replace(a.Description, "[^0-9a-zA-Z]+", ""), StringComparison.InvariantCultureIgnoreCase)
);