【问题标题】:Check if dictionary contains substring?检查字典是否包含子字符串?
【发布时间】:2013-03-04 22:28:31
【问题描述】:

假设我有两个具有以下键值对的字典:

1, "Hello"
2, "Example"

另外一本字典如下:

1, "HelloWorld"
2, "Example2"

我想知道这些字典中是否包含子字符串“hello”。
dictionary.ContainsValue("Hello") 适用于第一个示例,但不适用于第二个示例。如何检查字典中所有值中是否存在子字符串?

【问题讨论】:

    标签: c# string dictionary string-parsing


    【解决方案1】:

    字典不允许搜索子字符串。要找到它,您需要枚举所有值并检查每个值的子字符串,如 juharr 所建议的那样。然而,这种方法效率极低。仅当您根本不关心搜索性能时才使用它。
    如果您需要良好的性能,请使用后缀数组算法。 https://en.wikipedia.org/wiki/Suffix_array

    【讨论】:

    • 这似乎有点矫枉过正,并且无法在“HelloWorld”中找到“Hello”,因为在这种情况下“Hello”不是后缀。
    • @juharr,如果 TS 不关心性能,这可能是矫枉过正,但你显然不明白什么是后缀数组算法。它总能找到 any 个子字符串。
    • 显然你应该解释什么是后缀数组算法以及它是如何工作的。
    • @scenia,引用的 Wikipedia 文章包含您需要的有关后缀数组的所有信息。
    【解决方案2】:
    dictionary.Values.Any(v => v.Contains("Hello"));
    

    字典本身不是 IEnumerable,因此它不会应用 LINQ 扩展。

    【讨论】:

    • 字典是IEnumerableKeyValuePairs
    【解决方案3】:

    只需使用Any 来检查包含“Hello”的第一个值

    dictionary.Any(kvp=>kvp.Value.Contains("Hello"))
    

    【讨论】:

    • 无法识别“Any”功能。
    • 确保添加using System.Linq;
    • 这需要检查每个字典元素,所以字典的任何性能提升都将被忽略。
    • @user626528 错误,Any 检查与谓词匹配的第一个值。
    • 效果很好!谢谢,我还需要 7 分钟才能将其标记为答案,但我会的。
    猜你喜欢
    • 2011-11-09
    • 2013-05-18
    • 2015-11-12
    • 2017-02-27
    • 2021-12-20
    • 1970-01-01
    • 2014-11-22
    • 2013-02-05
    • 1970-01-01
    相关资源
    最近更新 更多