【问题标题】:Case insensitive search on Case sensitive dictionary C#区分大小写的字典 C# 上的不区分大小写搜索
【发布时间】:2017-12-01 09:33:45
【问题描述】:

我有一个区分大小写的字典,

 Dictionary<string, uint> itemNames = new Dictionary<string, uint>(StringComparer.Ordinal);

所以我可以在这本字典中有区分大小写的键。

例如,我可以有以下键值对,

  1. { 测试,10 }
  2. { 测试,20 }
  3. { test1, 30 }
  4. { test2, 40 }

...

当有人传递密钥时,我想检索该值。检索应该部分不区分大小写,这意味着,如果完全匹配,则返回区分大小写的结果,如果不存在区分大小写的键,则检索不区分大小写的键值。

例如,将上述值插入字典中

如果用户将密钥作为“TEST”传递,我需要返回 20。

如果用户将 key 作为 "TEST1" 传递,则找不到区分大小写的 key,所以我需要返回 30。

如何在 C# 中实现这一点?

【问题讨论】:

  • 如果我要“test”,我应该得到 10 还是 20?
  • @JeroenMostert,这两个值都可以。可能可以返回第一个最佳匹配。所以 10.
  • 添加@JeroenMostert 评论,这种混合永远不会好。确定您是否有区分大小写的键。
  • @OfirWinegarten 是的,你是对的一种方式。但我的要求是有区分大小写的字典,但是在检索值时,首选是最佳匹配,如果不是,至少返回不区分大小写。
  • 您可以维护第二个字典,将不区分大小写的键映射到第一个字典中的“a”区分大小写键(或直接映射到值,具体取决于更方便的方法)。缺点:维护两本字典比较困难。优点:查找仍然是 O(1)(与遍历键的任何解决方案相反)。

标签: c# dictionary case-sensitive case-insensitive


【解决方案1】:

就性能而言,获得O(1) 平均查找时间的唯一方法是拥有两个字典,其中一个将使用默认比较器,另一个使用不区分大小写的比较器:

// map each string to single item
Dictionary<string, int> CaseSensitive;
    
// map each string to multiple items, case insensitive
Dictionary<string, List<KeyValuePair<string, int>>> CaseInsensitive;

甚至

// map each string to single item
Dictionary<string, int> CaseSensitive;
    
// map each string to multiple items, case insensitive, with O(1) lookup time
Dictionary<string, HashSet<KeyValuePair<string, int>>> CaseInsensitive;

然后,您的不区分大小写的搜索可以正确返回所有匹配项,而不仅仅是最近插入的匹配项。

【讨论】:

    【解决方案2】:

    您应该首先使用TryGetValue 来检查是否有项目。如果没有,请选择第一个匹配项:

    string key = "test1";
    int val;
    if (!itemNames.TryGetValue(key, out val))
    {
        val = itemNames.FirstOrDefault
                        (k => string.Equals(k.Key, key, StringComparison.OrdinalIgnoreCase)
                        )?.Value ?? 0;
    }
    

    请注意此代码的性能。如果您有一个大型字典,第一次尝试时有很多未命中,那么第二个(不区分大小写)字典会更好。

    【讨论】:

    • 请注意这段代码的性能。如果你有一个大字典,第二个(不区分大小写)字典会更好。
    猜你喜欢
    • 2020-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    • 2010-09-15
    • 2013-06-15
    • 2018-12-30
    相关资源
    最近更新 更多