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

C#中过滤列表相似元素:保留指定元素并忽略关联冗余项

问题

我通过编程生成了如下字符串列表:

var list = new List<string>
{
    "anonim",
    "anonim şirket",
    "anonim şirketler",
    "tapu",
    "tapu senedi",
    "tapu kütüğü",
    "yaptırım",
    "müeyyide",
    "işçi",
    "işçi alacakları",
    "işçi hakları",
    "işçi lehine yorum ilkesi",
    "işçilik sözleşmesi",
    "limited şirket",
    "sınırlı ayni hak",
    "telif hakkı",
    "unutulma hakkı",
    "yolsuz tescil",
    "zamanaşımı"
};

该列表包含大量重复相似元素,我希望借助字典来过滤这些元素:若字典的键存在于列表中,则忽略字典值里以逗号分隔的对应元素。对应的字典如下:

var dict = new Dictionary<string, string>
{
    {"anonim şirket", "anonim, anonim şirketler"}, 
    {"tapu senedi", "tapu, tapu kütüğü"}, 
    {"yaptırım", "müeyyide"}, 
    {"işçi hakları", "işçi, işçi alacakları, işçi lehine yorum ilkesi, işçilik sözleşmesi"}
};

期望得到的最终列表如下:

var new_list = new List<string>()
{
    "anonim şirket",
    "tapu senedi",
    "yaptırım",
    "işçi hakları",
    "limited şirket",
    "sınırlı ayni hak",
    "telif hakkı",
    "unutulma hakkı",
    "yolsuz tescil",
    "zamanaşımı"
};

我尝试编写了如下foreach循环,但不知道循环内部应该编写什么代码:

var newList = new List<string>();
foreach (var l in list)
{
    // WHAT MUST I DO IN HERE?
}

解决方案

要实现这个过滤逻辑,我们可以先把字典中需要排除的元素整理成一个高效查找的集合,再结合字典的键来筛选列表元素。具体实现如下:

基础循环实现

var newList = new List<string>();
// 先整理所有需要排除的元素集合(用HashSet提升查找效率)
var excludeItems = new HashSet<string>();
foreach (var kvp in dict)
{
    // 拆分字典值中的元素,去除前后空格后添加到排除集合
    var items = kvp.Value.Split(',')
                       .Select(s => s.Trim())
                       .ToList();
    foreach (var item in items)
    {
        excludeItems.Add(item);
    }
}

// 遍历原列表进行筛选
foreach (var l in list)
{
    // 如果当前元素是字典的键,或者不在排除集合中,就保留
    if (dict.ContainsKey(l) || !excludeItems.Contains(l))
    {
        newList.Add(l);
    }
}

LINQ简化实现

如果偏好更简洁的代码,可以用LINQ一次性完成:

// 生成需要排除的元素集合
var excludeItems = dict.Values
                       .SelectMany(v => v.Split(',').Select(s => s.Trim()))
                       .ToHashSet();

// 直接筛选出符合条件的元素
var newList = list.Where(l => dict.ContainsKey(l) || !excludeItems.Contains(l))
                  .ToList();

逻辑说明

  • 使用HashSet<string>存储排除元素,是因为它的存在性查找效率远高于普通列表,适合高频检查场景。
  • 拆分字典值时调用Trim(),是为了处理逗号前后的空格(比如"anonim, anonim şirketler"中的空格),避免因空格导致的匹配失败。
  • 筛选条件确保:字典的键会被保留,不在排除集合中的其他元素也会被保留,完全匹配你期望的最终结果。

内容的提问来源于stack exchange,提问作者Johnny Wind

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 11:31:14