首页 新闻 会员 周边

C#: 如何创建忽略大小写的 key 类型为 char 的 Dictionary

0
悬赏园豆:30 [已解决问题] 解决于 2023-01-27 10:12

如果是 string 类型的 key,可以使用 StringComparer.OrdinalIgnoreCase

var dict = new Dictionary<string, TrieNode>(StringComparer.OrdinalIgnoreCase);

但现在是 char 类型,需要的参数类型是 IEqualityComparer<char>,请问如何实现?

C#
dudu的主页 dudu | 高人七级 | 园豆:30994
提问于:2023-01-26 17:11
< >
分享
最佳答案
0

目前实现的一个版本

public class CharComparer : IEqualityComparer<char>
{
    public static CharComparer IgnoreCase { get; } = new CharComparer();

    public bool Equals(char x, char y)
    {
        return char.IsLetter(x) && char.IsLetter(y) ?
            char.ToLowerInvariant(x) == char.ToLowerInvariant(y)
            : x.Equals(y);
    }

    public int GetHashCode([DisallowNull] char obj)
    {
        return char.IsLetter(obj) ?
            char.ToLowerInvariant(obj).GetHashCode() :
            obj.GetHashCode();
    }
}

测试代码

[Fact]
public void CharComparer_test()
{
    var dict = new Dictionary<char, TrieNode>(CharComparer.IgnoreCase);
    dict.Add('a', new TrieNode('c'));
    Assert.True(dict.ContainsKey('A'));
    Assert.False(dict.ContainsKey('b'));
}

测试通过

Passed!  - Failed:     0, Passed:     1
dudu | 高人七级 |园豆:30994 | 2023-01-26 21:57
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册