问题
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