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

如何使用C# LINQ筛选出List2中name存在于List1的元素?

如何用C# LINQ筛选出List2中与List1匹配的元素?

问题描述

给定两个列表:

  • List1:字符串列表 {"test1", "test2","test3"}
  • List2:自定义对象列表(对象包含name和value属性),元素为 {"name": "test1", "value":1},{"name": "test2", "value":2},{"name": "test5", "value":5}

需要得到List3,仅保留List2中name存在于List1里的元素,结果为:{"name": "test1", "value":1},{"name": "test2", "value":2}

实现方案

首先定义对应的数据类(假设List2的元素类型为Item):

public class Item
{
    public string name { get; set; }
    public int value { get; set; }
}

方法1:使用Where + HashSet(大列表场景性能更优)

先把List1转为HashSet降低查找复杂度,再用Where过滤List2:

// 初始化输入列表
List<string> list1 = new List<string> { "test1", "test2", "test3" };
List<Item> list2 = new List<Item>
{
    new Item { name = "test1", value = 1 },
    new Item { name = "test2", value = 2 },
    new Item { name = "test5", value = 5 }
};

// 转换为HashSet,将单元素查找复杂度从O(n)降为O(1)
HashSet<string> nameHashSet = new HashSet<string>(list1);

// 筛选匹配元素
List<Item> list3 = list2.Where(item => nameHashSet.Contains(item.name)).ToList();

方法2:使用Join(LINQ原生关联操作)

利用Join直接关联两个列表,匹配后返回List2的元素:

List<Item> list3 = list2.Join(
    list1,
    item => item.name, // List2的关联键
    name => name,      // List1的关联键
    (item, _) => item  // 匹配后返回List2的元素
).ToList();

说明

  • 如果List1元素数量较多,优先选择以上两种方法,两者内部都用哈希表优化,时间复杂度为O(n+m);若直接使用list2.Where(item => list1.Contains(item.name)),时间复杂度会达到O(n*m),大列表场景性能差异明显。
  • 两种方法最终得到的List3结果一致,可根据代码可读性偏好选择。

内容的提问来源于stack exchange,提问作者sanil mendonca

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 09:05:24