尝试遵循文档,我无法使其工作。使用键字符串键入KeyedCollection。
如何在KeyedCollection中使字符串键不区分大小写?
在Dictionary上只能在ctor中传递StringComparer.OrdinalIgnoreCase。
private static WordDefKeyed wordDefKeyed = new WordDefKeyed(StringComparer.OrdinalIgnoreCase); // this fails
public class WordDefKeyed : KeyedCollection<string, WordDef>
{
// The parameterless constructor of the base class creates a
// KeyedCollection with an internal dictionary. For this code
// example, no other constructors are exposed.
//
public WordDefKeyed() : base() { }
public WordDefKeyed(IEqualityComparer<string> comparer)
: base(comparer)
{
// what do I do here???????
}
// This is the only method that absolutely must be overridden,
// because without it the KeyedCollection cannot extract the
// keys from the items. The input parameter type is the
// second generic type argument, in this case OrderItem, and
// the return value type is the first generic type argument,
// in this case int.
//
protected override string GetKeyForItem(WordDef item)
{
// In this example, the key is the part number.
return item.Word;
}
}
private static Dictionary<string, int> stemDef = new Dictionary<string, int(StringComparer.OrdinalIgnoreCase); // this works this is what I want for KeyedCollection
答案 0 :(得分:7)
如果您希望类型WordDefKeyed
默认情况下不区分大小写,那么您的默认无参数构造函数应该将IEqualityComparer<string>
实例传递给它,如下所示:
public WordDefKeyed() : base(StringComparer.OrdinalIgnoreCase) { }
StringComparer
class有一些默认的IEqualityComparer<T>
实现,这些实现通常会根据您存储的数据类型使用:
StringComparer.Ordinal
和StringComparer.OrdinalIgnoreCase
- 当您使用机器可读字符串时使用,而不是输入或显示给用户的字符串。
StringComparer.InvariantCulture
和StringComparer.CultureInvariantIgnoreCase
- 当您使用的字符串不会显示在用户界面中,但对文化很敏感且跨文化可能相同时使用。
StringComparer.CurrentCulture
和StringComparer.CurrentCultureIgnoreCase
- 用于特定于当前文化的字符串,例如当您收集用户输入时。
如果您需要StringComparer
文化其他而不是当前文化的文化,那么您可以调用静态Create
method来创建StringComparer
}对于特定的CultureInfo
。