2017-04-14 82 views
0

符号看起来像我有一个问题串之间的符号编码,通过我的节目和字符串从另一个数据源检索建成。如何忽略字符串比较和字典查找

这里是一个.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); 

所以很明显,我有一个符号编码问题。我真正的问题是,以后我会用字典做同样的事情。字符串的哈希代码是不同的字典查找也未能:

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数据库的数据的副本。最后,nameToCheckPresence由大于ANTLR4CS的大字符串提取。

+2

这将是一个更容易帮助你,如果你提供了一个[MCVE],专注于* *一个问题,在您的文章,而不是仅仅描述* *大量的代码,然后问多个问题。 (目前尚不清楚,这有*任何与WPF,无论是。) –

+0

我想提供这样一个例子,但因为代码splited投入了大量的类和资源文件,这是非常困难的(我不能为你我整个ANTLR语法,解析器,访问者等)。你说得对,WPF是一个错误的关键词,我把它删除了! – fharreau

+0

您不需要提供所有ANTLR零件等。只是引起问题的零件的完整示例。对于硬编码输入而言,这绝对没问题。你应该尽可能小 - 如果ANTLR部分不相关,不要包含它。如果MySQL不相关,请不要包含它。这听起来像你只对字典查询感兴趣,它实际上不依赖于这些事情。 –

回答

0

这不是一个令人满意的答案,但仅此而已,我觉得要解决的问题。我没有通过索引器查看词典,而是在做一个linq查询:

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

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