C# 如何在字符串比较和字典查找中忽略符号

C# 如何在字符串比较和字典查找中忽略符号,c#,symbols,C#,Symbols,看起来我的程序构建的字符串和从另一个数据源检索的字符串之间的符号编码有问题 下面是一个例子,解释如下: var context = new List<Foo> { new Foo { Name = "SoW.Probing.4GEPCCore.CaptSite[1].S1U" }, new Foo { Name = "SoW.Probing.4GEPCCore.CaptSite[2].S1U" }, new Foo { Name = "SoW.Probing.

看起来我的程序构建的字符串和从另一个数据源检索的字符串之间的符号编码有问题

下面是一个例子,解释如下:

var context = new List<Foo>
{
    new Foo { Name = "SoW.Probing.4GEPCCore.CaptSite[1].S1U" },
    new Foo { Name = "SoW.Probing.4GEPCCore.CaptSite[2].S1U" },
    new Foo { Name = "SoW.Probing.2G3GPSCore.CaptSite[1].GnGpU" },
    new Foo { Name = "SoW.Probing.2G3GPSCore.CaptSite[2].GnGpU" }
};

var nameToCheckPresence = GetStringFromAnotherDataSource(); // the value of the string is for example: "SoW.Probing.4GEPCCore.CaptSite.S1U"

nameToCheckPresence = nameToCheckPresence.Replace("CaptSite", "CaptSite[1]");

var foo = context.FirstOrDefault(f => f.Name == nameToCheckPresence); // Should return an object since one object does have that name
很明显,我在符号编码方面有问题(代码)。我真正的问题是,后来,我正在用字典做同样的事情。字符串的哈希代码不同,字典查找也失败:

var dictionary = context.ToDictionary(f => f.Name);

var foo = dictionary[nameToCheckPresence]; // Should return the object but failed and throw a KeyNotFoundException
是否有方法在应用程序中以全局方式更改字符串符号编码?(就我而言,WPF申请)

由于
上下文可能非常大,因此计划首先也使用字典。所以,如果您提供的解决方案只适用于字典,这不是问题


请注意,数据源是一个SQLite数据库,其中是另一个WPF应用程序(在同一台计算机上运行,没有特定的区域性设置)填充的MySQL数据库数据的副本。最后,
nameToCheckPresence
是从一个较大的字符串中提取出来的。

这不是一个令人满意的答案,但这就是我发现的解决问题的全部方法。我没有通过索引器查看字典,而是执行linq查询:

dictionary.FirstOrDefault(pair => CultureInfo.CurrentCulture.CompareInfo.Compare(pair.Key, localFactName, CompareOptions.IgnoreSymbols) == 0).Value;

但这样做,我失去了字典访问复杂性的所有好处。如果有人有更好的解决方案,我会接受

如果你能在文章中提供一个简单的答案并专注于一个问题,而不仅仅是描述大量代码,然后问多个问题,那么帮助你会容易得多。(也不清楚这是否与WPF有关。)我想提供这样一个示例,但这非常困难,因为代码被拆分为许多类和资源文件(我无法向您提供我的整个ANTLR语法、解析器、访问者等)。你是对的,WPF是一个错误的关键字,我删除了它!您不需要提供所有的ANTLR部件等。只需提供导致问题的部件的完整示例。这是绝对好的,有硬编码的输入。您应该尽可能地缩小它-如果ANTLR部分不相关,就不要包含它。如果MySQL与此无关,请不要将其包括在内。听起来你只对查字典感兴趣,这实际上并不取决于这两件事。我希望现在它更好!在您的fiddle示例中,referentiel有一个尾随空格,因此一种方法可能是在添加到字典之前从该字符串中
修剪
空白。或者,您可以指定自定义的
IEqualityComparer
作为
ToDictionary
的参数。自定义比较器可以实现为忽略符号。
dictionary.FirstOrDefault(pair => CultureInfo.CurrentCulture.CompareInfo.Compare(pair.Key, localFactName, CompareOptions.IgnoreSymbols) == 0).Value;