2016-03-04 164 views
2

我有商店(的ObservableCollection<Store>類型)的列表和Store對象有一個名爲特點List<Feature>型)屬性。和Feature對象有一個名稱屬性(類型string)。LINQ相交於內收集

總括來說,專賣店的名單有特色

我有DesiredFeatures(的List<string>類型)第二集合的列表。

我需要使用LINQ給我結果所有的DesiredFeatures商店。到目前爲止,我只能提出一個查詢,該查詢給出了結果,而不是

這裏是一個樣子:

var q = Stores.Where(s=> s.Features.Any(f=> DesiredFeatures.Contains(f.name)));

我知道Intersect能有所幫助,這裏是我是如何使用它:

var q = Stores.Where(s => s.Features.Intersect<Feature>(DesiredFeatures));

這是我被困,Intersect想要一個Feature對象,我需要相交的是Feature.Name。

目標是結束一個ObservableCollection,其中每個商店都具有所有DesiredFeatures。

謝謝!

回答

1

我需要使用LINQ給我的唯一結果有全部 DesiredFeatures的商店。

換句話說,每個所需的功能必須具有匹配的存儲功能。

我不明白Intersect在這種情況下可以提供什麼幫助。上述標準中的LINQ直接翻譯是這樣的:

var q = Stores.Where(s => 
    DesiredFeatures.All(df => s.Features.Any(f => f.Name == df)) 
); 

更有效的方法可能是使用GroupJoin進行比賽:

var q = Stores.Where(s => 
    DesiredFeatures.GroupJoin(s.Features, 
     df => df, sf => sf.Name, (df, sf) => sf.Any() 
    ).All(match => match) 
); 

Except檢查無與倫比的項目:

var q = Stores.Where(s => 
    !DesiredFeatures.Except(s.Features.Select(sf => sf.Name)).Any() 
); 
+0

感謝Ivan,GroupJoin是完美的解決方案,並做到了這一點。 –

2

你幾乎已經完成了你所需要的。一個小的改進將是交換DesiredFeaturess.Features

var q = Stores.Where(s => DesiredFeatures.All(df => s.Features.Contains(df))); 

這意味着只採取那些商店的功能都包含所需功能的商店。

+0

非常接近,但我的'df'是一個字符串,而不是一個功能。我想我可以重構DesiredFeatures列表,但這看起來像一個創可貼 –

1

去上你的想法相交,我想使這項工作的唯一方法是通過使用Select得到Store.Features(List<Feature>)爲特徵的名稱(List<string>)的列表,並相交,與DesiredFeatures。

更新答:

var q = Stores.Where(s => s.Features.Select(f => f.Name).Intersect(DesiredFeatures).Any()); 

var q = Stores.Where(s => DesiredFeatures.Intersect(s.Features.Select(f => f.Name)).Any()); 

老回答(如果DesiredFeatures是List<Feature>

var q = Stores.Where(s => s.Features.Select(f => f.Name).Intersect(DesiredFeatures.Select(df => df.Name)).Any()); 
+0

非常接近,但DesiredFeatures是一個'列表'。如果我更改了'DesiredFeatures.Select(df => df)',我會得到與原始嘗試相同的結果。 –

+0

哦,道歉。我沒有看到DesiredFeatures是一個字符串列表。是功能名稱列表還是其他信息?你也應該在你的問題中指定這個。 – Kody

+0

是的,我知道它在我的第一個查詢中出現,但謂詞中的f.name來自Features。我試圖重構列表,而不是因爲它可能不那麼複雜 –

0

您希望代碼執行的兩件事。

var q = Stores.Where(s=> s.Features.All(f=> DesiredFeatures.Contains(f.name)) && 
         s.Features.Count() == DesiredFeatures.Count()); // Incude Distinct in the comparison if Features list is not unique 
  • 確保特點是DesiredFeature
  • 商店包含所有期望的功能。

守則Features收集上述假定的獨特性以及DesiredFeatures,修改代碼作爲註釋行指出,如果這是不正確的