Linq从另一个列表中获取列表

时间:2011-06-12 18:39:29

标签: c# linq join

我有两个集合:一个是Items,另一个是ActiveItems

这两个集合之间唯一的交集是名称

我想要一个包含Linq的列表,其中Items名称位于具有该名称的ActiveItems中

我写这段代码有更好的主意:

Items.Where(i => ActiveItems.Count(v=> v.Name==i.Name) > 0)

4 个答案:

答案 0 :(得分:12)

我可能会从ActiveItems创建一组名称,然后使用它:

var activeNames = new HashSet<string>(activeItems.Select(x => x.Name));
var itemsWithActiveNames = items.Where(x => activeNames.Contains(x.Name))
                                .ToList();

另一种选择是使用连接,例如使用查询表达式:

var query = from activeItem in activeItems
            join item in items on activeItem.Name equals item.Name
            select item;

请注意,如果有多个具有相同名称的item值,则会提供重复的ActiveItem值。另一个替代连接,没有这个问题,但有点笨拙:

var query = from item in items
            join activeItem in activeItems 
                on item.Name equals activeItem.Name
                into g
            where g.Any()
            select item;

请注意,所有这些都将避免对名称进行O(N * M)检查 - 它们都将在幕后使用哈希表,以提供O(N + M)复杂度。

答案 1 :(得分:6)

Items.where(i => ActiveItems.Any(a => i.Name == a.Name))

答案 2 :(得分:0)

var results = from i1 in collection1.Items
              join i2 in collection2.ActiveItems on i1.Name equals i2.Name
              select i2.Name;

答案 3 :(得分:0)

使用联接:

from item in Items
join active in ActiveItems on item.Name equals active.Name
select item