Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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?

like image 219
Edward Tanguay Avatar asked Mar 22 '10 10:03

Edward Tanguay


People also ask

Are Dictionary Keys case-sensitive C#?

Dictionaries are case-sensitive by default - you don't need to do anything. Dictionary<string, string> myDict = new Dictionary<string, string>(); myDict. Add("A", "value1"); myDict.

Is contains key case-sensitive?

Remarks. The key is handled in a case-insensitive manner; it is translated to lowercase before it is used.

Are C# cases insensitive?

In programming languagesSome programming languages are case-sensitive for their identifiers (C, C++, Java, C#, Verilog, Ruby, Python and Swift).

Are Python dictionaries case-sensitive?

Dictionary Keys Are Case-Sensitive : Dictionary Key « Dictionary « Python.


1 Answers

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.

like image 132
Jon Skeet Avatar answered Oct 01 '22 01:10

Jon Skeet