Why can't I define a case-insensitve Dictionary in C#?

家住魔仙堡 提交于 2019-12-10 12:49:13

问题


This C#/WPF code:

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);

        }
    }
}

gives me the error:

The best overloaded method match for 'System.Collections.Generic.Dictionary.Dictionary(System.Collections.Generic.IDictionary)' has some invalid arguments

Yet I find this code example everywhere such as here and here.

How can I define a Dictionary whose keys are case-insensitve?


回答1:


You're trying to using StringComparison, which is an enum. You should be using StringComparer.InvariantCultureIgnoreCase instead - that's a property returning a StringComparer, which implements IEqualityComparer<string>. You'll then end up calling the Dictionary<,> constructor overload accepting an IEqualityComparer<TKey> which it can use to check for equality and generate hash codes.




回答2:


Change

StringComparison.InvariantCultureIgnoreCase

to

 StringComparer.InvariantCultureIgnoreCase



回答3:


Pass StringComparer.InvariantCultureIgnoreCase. Note StringComparer not StringComparison.

More generally, the Dictionary<TKey, TValue> constructor can take an argument of type IComparer<TKey>. As Jon notes, StringComparison is an enum. But StringComparer provides some "canned" implementation of IComparer<string>, and it's the latter that you need.




回答4:


This works on my computer:

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


来源:https://stackoverflow.com/questions/2491403/why-cant-i-define-a-case-insensitve-dictionary-in-c

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!