文字列を比較しています.Contains()
が、問題が見つかりました:
foreach (var pair in cluster)
{
if (pair.Key.Contains("a" + i.ToString()))
{
vlr = pair.Value;
}
}
「a1」で検索すると、「a10」、「a11」、「a1..」がヒットしています。の違いを比較する別の方法があります==
あなたのコメントに基づいて、あなたが探しているクエリは次のとおりだと思います。
var query = cluster.Where(kvp => kvp.Key
.Split('-')
.Contains("a" + i.ToString()) // Array.Contains, not String.Contains
)
.Select(kvp => kvp.Value);
検索文字列が、大きな部分文字列のプレフィックスやサフィックスではなく、分離された部分文字列であることを確認したい場合は、正規表現を使用できます。たとえば、文字列に or が含まれていて、 or が含まれてa5
いないa52
かどうかを確認するには、次のxa5
ようにします。
if (Regex.Matches(input, "\\ba5\\b").Count > 0) ...
次に例を示します。
Console.WriteLine(Regex.Matches("hello a5 world", "\\ba5\\b").Count > 0); // True
Console.WriteLine(Regex.Matches("hello a55 world", "\\ba5\\b").Count > 0); // False
Console.WriteLine(Regex.Matches("hello xa5 world", "\\ba5\\b").Count > 0); // False
これはideoneのデモです。
正規表現は、必要に応じて式を調整できるほど汎用性があります。正と負の先読み/後読みを使用できます。たとえば、の後に別の数字5
が続かない"a5(?!\\d)"
ことを確認する必要がある場合は、 と書くことができます。