对于包含特殊字符的字符串,C#String Equals比较方法失败

时间:2017-07-08 19:52:38

标签: c# string

我目前正在使用字符串Equals方法比较string类型的属性值。

示例:f.rfgmodel.Equals(model, StringComparison.OrdinalIgnoreCase)

现在我遇到的问题是,对于像'M& P9 Shield'这样的字符串(存储在我的数据库中的附件表中的枪支模型),它具有'&'符号,字符串Equals方法不会'工作。

可悲的是,我不能忽略这些模型值中的'&'符号,因此从数据库中的现有DB记录中删除'&'符号不是一种选择。

以下是我的代码:

[Route("filter/{pcategory}")]
        public IQueryable<AccessoryDto> GetAccessoryFilter(string pcategory = "", string model = "")
        {
            return db.Accessories.Where(f => (f.rfgacctype.Equals("holsters", StringComparison.OrdinalIgnoreCase) & f.rfgparentcategory.Equals(pcategory, StringComparison.OrdinalIgnoreCase) & f.rfgmodel.Equals(model, StringComparison.OrdinalIgnoreCase)))
            .Select(AsAccessoryDto);
        }

我的数据库表示例: Accessory Table

我搜索了很多,而且几个匹配项没有解决方案,更不用说提供足够的提示来引导我朝着正确的方向努力解决当前的问题。

示例1: C# String comparison fails for string having special character in it 在这个特定的线程中,用户@Biki对第一个答案留下了注释,声明Equals方法不起作用。这是真的。

示例2:这个没有帮助:Elastic Search-Search string having spaces and special characters in it using C#

如果有人能帮助提供解决方案,请提示我指向正确的方向。 提前致谢。非常感谢。

2 个答案:

答案 0 :(得分:0)

你看过数据库整理了吗?根据我的经验,大多数都设置为

  

不区分大小写,重音敏感

以下屏幕截图显示了我使用的数据库属性。排序规则是默认值Latin1_General_CI_AS。 CI =不区分大小写,AS =重音敏感。因此“用户”和“用户”将被视为相同,而“科莫”和“Cómo”将是不同的。

Database Collation

因此,如果是这种情况,您可以在不调用指定.Equals()的{​​{1}}的情况下执行,因为数据库正在为您执行此操作。考虑:

StringComparison.OrdinalIgnoreCase

我在我自己的数据库中使用了这个代码,该数据库有一个带有该名称的项目,下面是我得到的输出。这可能对你的情况有所帮助。

Screenshot of above code's output

答案 1 :(得分:0)

由于问题是由用于&#39; M&amp; P9 Shield&#39;的网址编码值引起的。当作为我的端点的输入参数传递时,我意识到特殊字符&#39;&amp;&#39;没有被正确编码,因为网址编码的值最终为:http://localhost:56206/api/accessories/filter/pistols?caliber=9mm%20Luger%20(9x19%20Para)&model=M&P9%20Shield

代替: http://localhost:56206/api/accessories/filter/pistols?caliber=9mm%20Luger%20(9x19%20Para)&model=M%26P9%20Shield

我使用了这个资源https://www.w3schools.com/tags/ref_urlencode.asp

所以&#39;&amp;&#39;被认为是不安全的ASCII字符被编码为&#39;%26&#39;

谢谢大家。