C# 如何在字典中通过不区分大小写的键获取原始大小写键<;字符串,int>;

C# 如何在字典中通过不区分大小写的键获取原始大小写键<;字符串,int>;,c#,dictionary,case-insensitive,C#,Dictionary,Case Insensitive,有一本字典: var dictionary1 = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase) {{"abc1", 1}, {"abC2", 2}, {"abc3", 3}}; 如果搜索键“Abc2”我需要获得原始键“Abc2”和值2 如何通过不区分大小写的密钥获取原始大小写密钥?很遗憾,您不能这样做。Dictionary公开一个booltrygetentry(TKey,keyvaluepaire

有一本字典:

var dictionary1 = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase)
    {{"abc1", 1}, {"abC2", 2}, {"abc3", 3}};
如果搜索键
“Abc2”
我需要获得原始键
“Abc2”
和值2


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

很遗憾,您不能这样做。
Dictionary
公开一个
booltrygetentry(TKey,keyvaluepairentry)
方法是完全合理的,但它没有这样做

正如stop cran在评论中所建议的那样,最简单的方法可能是使字典中的每个值成为一对,其键与字典中的键相同。因此:

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
}
var dictionary=新字典(StringComparer.OrdinalIgnoreCase)
{
//您通常会编写一个helper方法,以避免必须指定
//当然,钥匙是两次。
{“abc1”,新的KeyValuePair(“abc1”,1)},
{“abC2”,新的KeyValuePair(“abC2”,2)},
{“abc3”,新的KeyValuePair(“abc3”,3)}
};
if(dictionary.TryGetValue(“Abc2”,输出var条目))
{
Console.WriteLine(entry.Key);//abC2
Console.WriteLine(entry.Value);//2
}
其他的
{
controlle.WriteLine(“找不到键”);//在本例中,我们不在这里
}

如果这是类中的一个字段,则可以编写帮助器方法使其更简单。您甚至可以围绕
Dictionary
编写自己的包装器类来实现
IDictionary
,但是添加一个额外的
TryGetEntry
方法,这样调用者就不需要知道“内部”是什么字典看起来像。

即使大小写与键不匹配,也可以使用以下代码利用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
Dictionary dictionary1=新字典(StringComparer.OrdinalIgnoreCase)
{
{“abc1”,1},
{“abC2”,2},
{“abc3”,3}
} ;
var值1=字典1[“ABC2”]//这就得到了2,即使key的大小写不是macth
//使用LINQ实现您的需求
var-keyValuePair1=dictionar1.SingleOrDefault(d=>d.Key.Equals(“Abc2”,StringComparison.OrdinalIgnoreCase));
var key1=keyValuePair1.Key//给了我们abC2
var value2=keyValuePair1.Value//给我们2

为字典编写不区分大小写的索引我不认为字典是这样工作的。尝试不同的数据结构。@SamvelPetrosov,将原始区分大小写的键放在哪里?尝试将原始键与值一起存储在类似于
字典
的结构中。因此,您可以将值与原始键结合在一起。需要明确的是,这是一件完全合理的事情,没有理由
Dictionary
不能提供此功能。事实并非如此:(但这将O(1)运算变成了O(n)运算,使得字典的使用变得相对毫无意义。在非常特殊的情况下,这可能没什么问题,但我通常认为,如果使用字典,至少部分是为了避免O(n)查找。这是正确的,因为字典应该很快。但是如果字典很小呢?当然,它会起作用的-但我认为这至少应该在答案中突出显示出来,因为它违背了使用字典的通常期望。谢谢你提供的重要信息。我已经在我的an中添加了这一点作为注释回答。@Sunil,正如Daisy Shipton指出的那样,这对我来说毫无意义。这本词典的整个过程都是web请求,已经花了1个小时,这太长了。我需要它尽可能快地处理词典中的100000个条目。但对于简短的词典来说,它绝对有用。
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