如何通过字典中不区分大小写的键获取原始大小写键<string, int>
How to get original case key by case insensitive key in Dictionary<string, int>
有词典:
var dictionary1 = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase)
{{"abc1", 1}, {"abC2", 2}, {"abc3", 3}};
我可以得到一个值:
var value = dictionary1["Abc2"];
如果搜索键"Abc2"
我需要得到原始键"abC2"
和值2.
如何通过不区分大小写的密钥获取原始大小写密钥?
很遗憾,您不能那样做。 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
}
如果这是 class 中的字段,您可以编写辅助方法以使其更简单。您甚至可以围绕 Dictionary
编写自己的包装器 class 来实现 IDictionary<TKey, TValue>
但添加一个额外的 TryGetEntry
方法,这样调用者就永远不需要知道 "inner"字典看起来像。
即使大小写与键不匹配,您也可以使用以下代码利用 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
有词典:
var dictionary1 = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase)
{{"abc1", 1}, {"abC2", 2}, {"abc3", 3}};
我可以得到一个值:
var value = dictionary1["Abc2"];
如果搜索键"Abc2"
我需要得到原始键"abC2"
和值2.
如何通过不区分大小写的密钥获取原始大小写密钥?
很遗憾,您不能那样做。 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
}
如果这是 class 中的字段,您可以编写辅助方法以使其更简单。您甚至可以围绕 Dictionary
编写自己的包装器 class 来实现 IDictionary<TKey, TValue>
但添加一个额外的 TryGetEntry
方法,这样调用者就永远不需要知道 "inner"字典看起来像。
即使大小写与键不匹配,您也可以使用以下代码利用 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