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.id,即 LAN 中有任何 Project.lan。

任何的想法?

4

5 回答 5

3

我会使用 aHashSet而不是数组,因为它允许检查是否包含作为 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);
于 2012-11-07T11:55:43.833 回答
2

怎么样

indexFiltered = Projects.Where(p=>lan.Any(l=>l==p.lan)).Select(p=>p.Id); 
于 2012-11-07T11:53:20.070 回答
2
 var results = projects.Where(p => lan.Contains(p.lan));
于 2012-11-07T11:54:29.907 回答
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 运算符从第一个表中获取行,然后仅从第二个表中获取具有匹配键的行,然后仅从第三个表中获取具有匹配键的行。

于 2012-11-07T12:03:50.357 回答
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);
}
于 2012-11-07T12:08:42.237 回答