在不区分大小写的HashSet <string>中获取值

时间:2015-06-02 23:11:56

标签: c# .net hashtable

我有不区分大小写的HashSet<string>

private HashSet<string> a = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase);

我很好奇现在是否可以在实际案例中提取字符串。我需要的伪代码:

return a.Contains(word) ? a[word] : null;

(只是一个伪代码,它不起作用)

例如,我在HashSet中有字符串“ TestXxX ”。我需要将“testxxx”(或“tEsTXXx”)作为输入并返回“ TestXxX ”的代码。

我目前的解决方法是改为使用Dictionary<string,string>并为键和值设置相同的值。这显然不优雅,并且实际需要消耗2倍的内存。

2 个答案:

答案 0 :(得分:6)

您可以覆盖KeyedCollection

public class Keyed : KeyedCollection<string, string>
{
    public Keyed(IEqualityComparer<string> comparer) : base(comparer)
    {

    }

    protected override string GetKeyForItem(string item)
    {
        return item;
    }
}

然后使用它:

var keyed = new Keyed(StringComparer.InvariantCultureIgnoreCase);
keyed.Add("TestXxX");

Console.WriteLine(keyed["tEsTXXx"]);

答案 1 :(得分:0)

HashSet<T>没有公开任何功能来实现您正在寻找的内容。如果您不需要使用HashSet,那么Kirill Polishchuk的回答对我来说很有意义。

否则,如果你确实需要HashSet,那么有点讨厌的黑客就是使用自定义的相等比较器。创建自己的相等比较器,只需将所有请求转发到StringComparer.InvariantCultureIgnoreCase,但缓存最后传递的对象。

如果你有,那么在a.Contains(word)返回true之后,最后传递的对象为1)word和2)这个词为它出现在a

严格地说,这不能保证有效,因为允许HashSet以不同于您期望的值调用比较器。它确实可以在当前版本的.NET Framework中工作,并且将来不太可能会破坏:显然需要使用这些参数调用比较器相等函数,以便Contains返回正确的值,除了故意破坏这样的代码之外,没有任何理由可以使用任何其他参数进行调用。