得到一個名單,我有兩個類別:一個是項目,另一個是ActiveItems的LINQ從另一個列表中
這兩個集合之間唯一的交集是名稱
我想從項目在項目使用LINQ的列表名字都在ActiveItems該名稱
我寫這個代碼是有一個更好的主意:
Items.Where(i => ActiveItems.Count(v=> v.Name==i.Name) > 0)
得到一個名單,我有兩個類別:一個是項目,另一個是ActiveItems的LINQ從另一個列表中
這兩個集合之間唯一的交集是名稱
我想從項目在項目使用LINQ的列表名字都在ActiveItems該名稱
我寫這個代碼是有一個更好的主意:
Items.Where(i => ActiveItems.Count(v=> v.Name==i.Name) > 0)
我可能會創建一組的從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;
注意,如果有多個ActiveItem
值具有相同名稱的這會給重複item
值。另一種選擇加入,不存在這個問題,但有點笨拙:
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)的複雜性。
Items.where(i => ActiveItems.Any(a => i.Name == a.Name))
var results = from i1 in collection1.Items
join i2 in collection2.ActiveItems on i1.Name equals i2.Name
select i2.Name;
使用連接:
from item in Items
join active in ActiveItems on item.Name equals active.Name
select item
連接應該是... on item.Name等於active.Name。序列很重要 – slfan 2012-08-09 21:12:46
不,我不從另一個集合 – 2011-06-12 18:45:43
想要的屬性,我認爲你的第一個答案是最好的感謝了很多+1 – 2011-06-12 18:48:13
將溶液2和3在內部使用HashSets而沒有'activeNames'是一個? – Magnus 2011-06-12 19:01:25