Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#字符串比较等于false_C#_.net_String Comparison - Fatal编程技术网

C#字符串比较等于false

C#字符串比较等于false,c#,.net,string-comparison,C#,.net,String Comparison,我有一个字符串比较问题,在大多数情况下,它的行为与预期的一样,但给我留下了大量重复的DB插入,因为我的代码没有检测到重复的字符串对 我以为我已经把它缩小到了一个文化问题(西里尔文字),我解决了这个问题,但现在我得到了“假否定”(两个明显相等的字符串显示为不相等) 我研究了以下类似的问题,并尝试了以下比较方法 类似于我检查过的问题: 下面是一个比较字符串的示例:(标题和说明) 提要标题:埃尔斯伯格:他是个英雄 feed desc:丹尼尔·埃尔斯伯格告诉CNN的唐·莱蒙,国家安全局泄密者

我有一个字符串比较问题,在大多数情况下,它的行为与预期的一样,但给我留下了大量重复的DB插入,因为我的代码没有检测到重复的字符串对

我以为我已经把它缩小到了一个文化问题(西里尔文字),我解决了这个问题,但现在我得到了“假否定”(两个明显相等的字符串显示为不相等)

我研究了以下类似的问题,并尝试了以下比较方法

类似于我检查过的问题:

下面是一个比较字符串的示例:(标题和说明)

提要标题:埃尔斯伯格:他是个英雄

feed desc:丹尼尔·埃尔斯伯格告诉CNN的唐·莱蒙,国家安全局泄密者爱德华·斯诺登表现出了勇气,做了巨大的贡献

db标题:Ellsberg:他是个英雄

db desc:Daniel Ellsberg告诉CNN的Don Lemon,NSA泄密者爱德华·斯诺登表现出了勇气 做了大量的工作

我的应用程序将从RSS提要获取的值与我在数据库中的值进行比较,并且应该只插入“新”值

显然,我一次只使用了上述选项中的一个

在大多数情况下,上述选项确实有效,并且检测到了大多数重复项,但是仍然有重复项从裂缝中滑过-我只需要了解“裂缝”是什么,所以任何建议都是非常受欢迎的

我甚至尝试过将字符串转换成字节数组并进行比较(抱歉,我刚才删除了该代码)

文章
对象如下:

    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)
    );