在不区分大小写的 HashSet<string> 中获取值
Get value in case-insensitive HashSet<string>
我不区分大小写HashSet<string>
:
private HashSet<string> a = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase);
我很好奇我现在是否可以在实际情况下提取字符串。我需要的伪代码:
return a.Contains(word) ? a[word] : null;
(只是伪代码,不会起作用)
例如,我在 HashSet 中有字符串“TestXxX”。我需要获取 "testxxx"(或 "tEsTXXx")作为输入和 returns“TestXxX”的代码。
我目前的解决方法是改用 Dictionary<string,string>
并为键和值设置相同的值。这显然不优雅,并且消耗了实际需要的 2 倍内存。
您可以覆盖 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"]);
HashSet<T>
没有公开任何功能来实现您正在寻找的内容。如果您不需要使用 HashSet
,那么 Kirill Polishchuk 的回答对我来说很有意义。
否则,如果您确实需要 HashSet
,一个有点讨厌的 hack 是使用自定义相等比较器。创建您自己的相等比较器,它只将所有请求转发到 StringComparer.InvariantCultureIgnoreCase
,但缓存最后传递的对象。
如果你有,那么在a.Contains(word)
returns true
之后,最后传递的对象应该是1) word
和 2) a
.
中出现的单词
严格来说,这不能保证有效,因为 HashSet
可以使用与您预期不同的值调用比较器。它肯定可以在当前版本的 .NET Framework 中工作,但将来不太可能中断:显然需要使用这些参数调用比较器相等函数,以便 Contains
到 return 正确的值,并且除了像这样故意破坏代码之外,没有理由使用任何其他参数调用它。
我不区分大小写HashSet<string>
:
private HashSet<string> a = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase);
我很好奇我现在是否可以在实际情况下提取字符串。我需要的伪代码:
return a.Contains(word) ? a[word] : null;
(只是伪代码,不会起作用)
例如,我在 HashSet 中有字符串“TestXxX”。我需要获取 "testxxx"(或 "tEsTXXx")作为输入和 returns“TestXxX”的代码。
我目前的解决方法是改用 Dictionary<string,string>
并为键和值设置相同的值。这显然不优雅,并且消耗了实际需要的 2 倍内存。
您可以覆盖 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"]);
HashSet<T>
没有公开任何功能来实现您正在寻找的内容。如果您不需要使用 HashSet
,那么 Kirill Polishchuk 的回答对我来说很有意义。
否则,如果您确实需要 HashSet
,一个有点讨厌的 hack 是使用自定义相等比较器。创建您自己的相等比较器,它只将所有请求转发到 StringComparer.InvariantCultureIgnoreCase
,但缓存最后传递的对象。
如果你有,那么在a.Contains(word)
returns true
之后,最后传递的对象应该是1) word
和 2) a
.
严格来说,这不能保证有效,因为 HashSet
可以使用与您预期不同的值调用比较器。它肯定可以在当前版本的 .NET Framework 中工作,但将来不太可能中断:显然需要使用这些参数调用比较器相等函数,以便 Contains
到 return 正确的值,并且除了像这样故意破坏代码之外,没有理由使用任何其他参数调用它。