我有两个集合:一个是Items,另一个是ActiveItems
这两个集合之间唯一的交集是Name
我想要一个带有Linq的列表,其中Items名称位于具有该名称的ActiveItems中
我写这段代码有一个更好的主意:
Items.Where(i => ActiveItems.Count(v=> v.Name==i.Name) > 0)
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 13
我可能会创建一组名称ActiveItems,然后使用它:
var activeNames = new HashSet<string>(activeItems.Select(x => x.Name));
var itemsWithActiveNames = items.Where(x => activeNames.Contains(x.Name))
.ToList();
Run Code Online (Sandbox Code Playgroud)
另一种选择是使用连接,例如使用查询表达式:
var query = from activeItem in activeItems
join item in items on activeItem.Name equals item.Name
select item;
Run Code Online (Sandbox Code Playgroud)
请注意,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;
Run Code Online (Sandbox Code Playgroud)
请注意,所有这些都将避免对名称进行O(N*M)检查 - 它们都将在幕后使用哈希表,以提供O(N + M)复杂度.
| 归档时间: |
|
| 查看次数: |
9486 次 |
| 最近记录: |