【问题标题】:How to ignore Symbols in string comparison and dictionary lookup如何在字符串比较和字典查找中忽略符号
【发布时间】:2017-04-14 10:22:32
【问题描述】:

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

这是.NET Fiddle,这是解释:

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

我的问题是foo 为空。如果我使用此代码行,它会起作用:

var foo = context .FirstOrDefault(f => CultureInfo.CurrentCulture.CompareInfo.Compare(f.Name, nameToCheckPresence , CompareOptions.IgnoreSymbols) == 0);

很明显,我的符号编码有问题(.?[]?)。我真正的问题是,后来,我用字典做同样的事情。字符串的hashcode不同,字典查找也失败:

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

var foo = dictionary[nameToCheckPresence]; // Should return the object but failed and throw a KeyNotFoundException

有没有办法在应用程序中以全局方式更改字符串符号编码? (在我的例子中是 WPF 应用程序)

由于context 可能非常大,因此也计划首先使用字典。因此,如果您为我提供仅适用于 Dictionary 的解决方案,那不是问题。

仅作记录,数据源是一个 SQLite 数据库,其中是由另一个 WPF 应用程序填充的 MySQL 数据库数据的副本(在同一台计算机上运行,​​没有特定的文化设置)。最后,nameToCheckPresenceANTLR4CS 从一个较大的字符串中提取出来。

【问题讨论】:

  • 如果您提供minimal reproducible example 并在您的帖子中专注于一个问题,而不仅仅是描述 很多代码,然后问多个问题。 (目前尚不清楚这与 WPF 是否有任何关系。)
  • 我想提供一个这样的例子,但是这非常困难,因为代码被分割成很多类和资源文件(我不能为你提供我的整个 ANTLR 语法、解析器、访问者等) .你是对的,WPF 是一个错误的关键词,我删除了它!
  • 您不需要提供所有 ANTLR 部件等。只是导致问题的部件的完整示例。具有硬编码输入绝对没问题。你应该让它尽可能小——如果 ANTLR 部分无关紧要,不要包括它。如果 MySQL 无关紧要,请不要包含它。听起来您只对字典查找感兴趣,而这实际上并不依赖于其中任何一个。
  • 希望现在好多了!
  • 在您的小提琴示例中,referentiel 有一个尾随空格,因此一种方法可能是在添加到字典之前从此字符串中添加Trim 空格。或者,您可以指定自定义IEqualityComparer&lt;string&gt; 作为ToDictionary 的参数。可以实现自定义比较器以忽略符号。

标签: c# symbols


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2010-09-28
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 2015-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-03
    相关资源
    最近更新 更多