C# 两个IEnumerable-LINQ之间的搜索

C# 两个IEnumerable-LINQ之间的搜索,c#,linq,ienumerable,C#,Linq,Ienumerable,嗨,你们能帮我吗?我试过几种方法。 我需要在两个IEnumerable之间搜索,这是代码 IEnumerable<Project> Projects = new[] { new Project {id = "1", lan = "test1"}, new Project {id = "2", lan = "test1"}} IEnumerable<string> lan = new [] { "test1", "test2"}; IEnumerable<stri

嗨,你们能帮我吗?我试过几种方法。 我需要在两个IEnumerable之间搜索,这是代码

IEnumerable<Project> Projects = new[] { new Project {id = "1", lan = "test1"},  new Project {id = "2", lan = "test1"}}

IEnumerable<string> lan = new [] { "test1", "test2"};
IEnumerable<string> indexFiltered = ?;
IEnumerable Projects=new[]{new Project{id=“1”,lan=“test1”},new Project{id=“2”,lan=“test1”}
IEnumerable lan=new[]{“test1”、“test2”};
IEnumerable indexFiltered=?;
我需要执行linq查询,返回lan中有任何Project.lan的Project.id

有什么想法吗?

怎么样

indexFiltered = Projects.Where(p=>lan.Any(l=>l==p.lan)).Select(p=>p.Id); 

我会使用
HashSet
而不是数组,因为它允许检查是否包含O(1)而不是O(n)操作:

HashSet<string> lan = new HashSet<string> { "test1", "test2" };
IEnumerable<string> indexFiltered = projects
    .Where(p => lan.Contains(p.lan))
    .Select(p => p.id);
HashSet lan=newhashset{“test1”、“test2”};
IEnumerable indexFiltered=项目
.Where(p=>lan.Contains(p.lan))
.选择(p=>p.id);

另一种有效的方法正在使用,因为它是作为哈希表实现的:

IEnumerable<string> indexFiltered = from p in Projects
                                    join l in lan on p.lan equals l
                                    select p.id;
IEnumerable indexFiltered=来自项目中的p
在p上的lan中加入l。lan等于l
选择p.id;


Join操作符从第一个表中获取行,然后从第二个表中仅获取具有匹配键的行,然后从第三个表中仅获取具有匹配键的行

我会使用
IEnumerable.Join()
。在内部,它使用
HashSet
进行区分:

var Projects = new[] { new {id = "1", lan = "test1"},  new {id = "2", lan = "test1"}};
var lan = new [] { "test1", "test2"};

var results = Projects.Join(lan,
                              project => project.lan,
                              lanName => lanName,
                              (project, lanName) => project.id);

foreach (var result in results)
{
    Console.WriteLine("ID found: ", result);
}

我尝试了几件事
告诉我们你尝试了什么。+1学习不是我不知道的东西,将来我会自己玩
HashSet
。我会使用Join,速度更快
var Projects = new[] { new {id = "1", lan = "test1"},  new {id = "2", lan = "test1"}};
var lan = new [] { "test1", "test2"};

var results = Projects.Join(lan,
                              project => project.lan,
                              lanName => lanName,
                              (project, lanName) => project.id);

foreach (var result in results)
{
    Console.WriteLine("ID found: ", result);
}