Почему я не могу определить словарь без учета регистра в C #? - PullRequest
8 голосов
/ 22 марта 2010

Этот код C # / WPF:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace TestDict28342343
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();

            Dictionary<string, string> variableNamesAndValues = 
                new Dictionary<string, string>(StringComparison.InvariantCultureIgnoreCase);

        }
    }
}

дает мне ошибку :

Лучший перегруженный метод соответствует 'System.Collections.Generic.Dictionary.Dictionary (System.Collections.Generic.IDictionary)' имеет несколько неверных аргументов

И все же я нахожу этот пример кода везде , например здесь и здесь .

Как определить словарь, ключи которого не чувствительны к регистру?

Ответы [ 4 ]

20 голосов
/ 22 марта 2010

Вы пытаетесь использовать StringComparison, что является перечислением. Вместо этого вы должны использовать StringComparer.InvariantCultureIgnoreCase - это свойство возвращает StringComparer, которое реализует IEqualityComparer<string>. Затем вы в конечном итоге вызовете перегрузку конструктора Dictionary<,>, принимая IEqualityComparer<TKey>, который он может использовать для проверки на равенство и генерирования хеш-кодов.

8 голосов
/ 22 марта 2010

Изменение

StringComparison.InvariantCultureIgnoreCase

до

 StringComparer.InvariantCultureIgnoreCase
3 голосов
/ 22 марта 2010

Pass StringComparer.InvariantCultureIgnoreCase. Примечание StringCompar er not StringCompar ison .

В более общем смысле конструктор Dictionary<TKey, TValue> может принимать аргумент типа IComparer<TKey>. Как отмечает Джон, StringComparison - это перечисление. Но StringComparer предоставляет некоторую «стандартную» реализацию IComparer<string>, и вам нужна последняя.

1 голос
/ 22 марта 2010

Это работает на моем компьютере:

Dictionary<string, string> dic = new Dictionary<string, string>( StringComparer.InvariantCultureIgnoreCase ).
...