在两个IEnumerable之间搜索 - LINQ

3

您好,您能帮我解决这个问题吗?我已经尝试了几种方法。 我需要在两个IEnumerables之间进行搜索,以下是代码。

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 = ?;

我需要进行一个linq查询,返回具有任何项目语言(Project.lan)的项目ID。 有什么想法吗?

2
我已经尝试了几件事情。请展示一下你尝试过的东西。 - Mahmoud Gamal
5个回答

3
我会建议使用HashSet而不是数组,因为它允许O(1)的check-if-contains操作,而不是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 - Adrian Thompson Phillips

2
如何呢?
indexFiltered = Projects.Where(p=>lan.Any(l=>l==p.lan)).Select(p=>p.Id); 

2
 var results = projects.Where(p => lan.Contains(p.lan));

0
另一种高效的方法是使用 Enumerable.Join,因为它实现为哈希表:
IEnumerable<string> indexFiltered = from p in Projects
                                    join l in lan on p.lan equals l
                                    select p.id;

为什么使用LINQ JOIN比使用WHERE连接更快?

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


我会使用Join,它更快。 - Don Juan

0

我会使用 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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接