Как получить оригинальный ключ к регистру без учета регистра в Словаре <string, int> - PullRequest
0 голосов
/ 14 сентября 2018

Есть словарь:

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

Я могу получить значение:

var value = dictionary1["Abc2"];

Если ключ поиска "Abc2" Мне нужно получить исходный ключ "abC2" и значение 2.

Как получить оригинальный ключ к регистру без учета регистра?

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Вы можете использовать следующий код, который использует 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
0 голосов
/ 14 сентября 2018

К сожалению, этого нельзя сделать. Для Dictionary<TKey, TValue> было бы вполне разумно выставить bool TryGetEntry(TKey key, KeyValuePair<TKey, TValue> entry) метод, но он этого не делает.

Как предложил стоп-кран в комментариях, простейший подход, вероятно, состоит в том, чтобы каждое значение в вашем словаре представляло собой пару с тем же ключом, что и ключ в словаре. Итак:

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, чтобы вызывающему никогда не нужно было знать, как выглядит «внутренний» словарь.

...