如何通过Dictionary <string,int =“”>中的大小写不敏感键获取原始大小写键

时间:2018-09-14 06:02:49

标签: c# dictionary case-insensitive

有词典:

var dictionary1 = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase)
    {{"abc1", 1}, {"abC2", 2}, {"abc3", 3}};

我可以得到一个值:

var value = dictionary1["Abc2"];

如果搜索键"Abc2",我需要获取原始键"abC2"和值2。

如何通过不区分大小写的密钥获取原始的案例密钥?

2 个答案:

答案 0 :(得分:5)

很遗憾,您不能这样做。 Dictionary<TKey, TValue>公开bool TryGetEntry(TKey key, KeyValuePair<TKey, TValue> entry)方法是完全合理的,但事实并非如此。

如评论中的stop-cran所建议,最简单的方法可能是使字典中的每个 value 成对,并使用与字典中的键相同的键。所以:

var dictionary = new Dictionary<string, KeyValuePair<string, int>>(StringComparer.OrdinalIgnoreCase)
{
    // You'd normally write a helper method to avoid having to specify
    // the key twice, of course.
    {"abc1", new KeyValuePair<string, int>("abc1", 1)},
    {"abC2", new KeyValuePair<string, int>("abC2", 2)},
    {"abc3", new KeyValuePair<string, int>("abc3", 3)}
};
if (dictionary.TryGetValue("Abc2", out var entry))
{
    Console.WriteLine(entry.Key); // abC2
    Console.WriteLine(entry.Value); // 2
}
else
{
    Console.WriteLine("Key not found"); // We don't get here in this example
}

如果这是类中的字段,则可以编写帮助程序方法以使其更简单。您甚至可以围绕Dictionary编写自己的包装器类来实现IDictionary<TKey, TValue>,但可以添加一个额外的TryGetEntry方法,这样调用者就无需知道“内部”字典的样子。 / p>

答案 1 :(得分:0)

即使键的大小写不匹配,也可以使用以下代码使用LINQ来获取字典键值对。

注意:该代码可用于任何大小的字典,但它最适合较小型的字典,因为LINQ基本上是逐个检查每个键值对,而不是直接转到所需的键值对。

Dictionary<string,int> dictionary1 = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase)
{
    {"abc1",1},
    {"abC2",2},
    {"abc3",3}
    } ;

var value1 = dictionary1["ABC2"];//this gives 2, even though case of key does not macth

//use LINQ to achieve your requirement
var keyValuePair1 = dictionary1.SingleOrDefault (d => d.Key.Equals("Abc2", StringComparison.OrdinalIgnoreCase) );

var key1 = keyValuePair1.Key ;//gives us abC2
var value2 =keyValuePair1.Value;//gives us 2