You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效检查List<StringCollection>是否包含指定StringCollection的全部字符串

C# 高效判断搜索字符串集合是否全部存在于目标集合列表的解决方案

更高效的替代数据结构

StringCollection是.NET早期推出的非泛型集合,它的Contains查找时间复杂度为O(n),性能远低于泛型集合HashSet<string>:HashSet<string>的查找时间复杂度为O(1),是这类存在性判断场景的最优选择。

实现思路

你需要判断搜索集合的元素是否存在于任意一个目标StringCollection中,我们可以先把所有目标集合的元素合并到全局HashSet<string>做预处理,后续所有存在性判断都只需要O(1)时间,整体复杂度远低于双层循环:

  • 双层循环方案时间复杂度:O(m * k),其中m是所有目标集合的总元素数,k是搜索集合的元素数
  • HashSet预处理方案时间复杂度:O(m + k),数据量越大性能优势越明显,如果有多次查询需求,预处理生成的HashSet还可以复用,进一步降低开销

完整实现代码

using System;
using System.Collections.Specialized;
using System.Collections.Generic;
                    
public class Program
{
    public static void Main()
    {
        // 原有初始化逻辑
        StringCollection myCol0 = new StringCollection();
        StringCollection myCol1 = new StringCollection();
        StringCollection myCol2 = new StringCollection();
        StringCollection SearchCol = new StringCollection();

        String[] myArr0 = new String[] { "RED", "car", "boat" };
        myCol0.AddRange(myArr0);
        String[] myArr1 = new String[] { "Blue", "Goku", "Nappa" };
        myCol1.AddRange(myArr1);
        String[] myArr2 = new String[] { "Yellow", "Winter", "Summer" };
        myCol2.AddRange(myArr2);
        String[] myArr3 = new String[] { "Yellow", "Blue", "RED" };
        SearchCol.AddRange(myArr3);
        
        List<StringCollection> a = new List<StringCollection>();
        a.Add(myCol0);
        a.Add(myCol1);
        a.Add(myCol2);

        // 1. 预处理:合并所有目标字符串到HashSet
        // 如需忽略大小写,可替换为 StringComparer.OrdinalIgnoreCase
        HashSet<string> allTargetStrings = new HashSet<string>(StringComparer.Ordinal);
        foreach (var col in a)
        {
            foreach (string s in col)
            {
                allTargetStrings.Add(s);
            }
        }

        // 2. 检查存在性,收集未找到的字符串
        List<string> notFoundList = new List<string>();
        foreach (string searchStr in SearchCol)
        {
            if (!allTargetStrings.Contains(searchStr))
            {
                notFoundList.Add(searchStr);
            }
        }

        // 3. 结果输出
        bool isAllExist = notFoundList.Count == 0;
        Console.WriteLine($"搜索集合所有元素是否都存在:{isAllExist}");
        if (notFoundList.Count > 0)
        {
            Console.WriteLine($"未找到的元素:{string.Join("、", notFoundList)}");
        }
    }
}

额外优化建议

如果是新开发的业务逻辑,建议完全弃用StringCollection,直接使用List<string>或者HashSet<string>这类泛型集合,既保证类型安全,又能获得更好的运行性能。

内容的提问来源于stack exchange,提问作者I am not Fat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 12:45:01