2017-04-14 9 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がnullであるということです。

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データベースのデータのコピーです。最後に、は、大きな文字列からANTLR4CSによって抽出されます。

+2

多くのコードを記述して複数の質問をするだけではなく、[mcve]を提供して、あなたの投稿に* one *の質問に重点を置くと助けがはるかに簡単です。 (これはWPFと何か関係があるとはっきりしていません) –

+0

私はそのような例を提供したいと思いますが、コードが多くのクラスとリソースファイルに分割されているので非常に難しいです全ANTLR文法、パーサー、訪問者など)。あなたは正しいです、WPFは間違ったキーワードです、私はそれを削除! – fharreau

+0

すべてのANTLR部品などを提供する必要はありません。問題の原因となっている部品の完全な例です。ハードコーディングされた入力を持つことは絶対に賢明です。できるだけ小さくする必要があります - ANTLR部分が無関係な場合は、それを含めないでください。 MySQLが無関係な場合は、それを含めないでください。実際にはこれらのもののどれにも依存しない辞書検索に興味があるように思えます。 –

答えて

0

これは満足な答えではありませんが、それだけで問題を解決できます。代わりにindexorて辞書を覗くと、私はLINQクエリをしています:

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

しかし、これをやって、私は辞書のアクセスの複雑さのすべての利益を失いました。誰かがより良い解決策を持っているなら、私はそれを取るでしょう!

関連する問題