2011-08-01 56 views
0

我有兩個列表包含的GUID:從使用LINQ,在項目出現在其它兩個列表列表中選擇項目

var activeSoftware = channels.ByPath("/software/").Children.Where(c => c.StateProperties.IsActive).Select(c => c.Guid); 
    var activeChannels = channels.ByPath("/game-channels/").Children.Where(c => c.StateProperties.IsActive).Select(c => c.Guid); 

和另一個列表,遊戲:

List<MyCms.Content.Games.Game> games = new List<MyCms.Content.Games.Game>();

的遊戲對象有兩個屬性可以使用:

game.gamingproperties.software - 其中包含軟件的指導 game.stateproperties.channels - 逗號列表分隔的GUID

是的,我知道它不好保存逗號分隔值的字段, 但我不能在這個時間點改變(其媒體鏈接工作40+網站)

我想做的事情,就是選擇所有遊戲中的軟件是有效的(通過比較softwarelistgame.gamingproperties.software),他們出現在通道被激活(通過檢查game.stateproperties.channels包含任何的activechannels的GUID)

原本,我已經這樣做了:

foreach (var channel in activeSoftware) 
    { 
     foreach (var match in oGames.AllActive.Where(g => !string.IsNullOrEmpty(g.GamingProperties.UrlDirectGame) && g.GamingProperties.Software.Contains(channel) && g.StateProperties.Channels.Split(',').Intersect(activeChannels).Any())) 
     { 
      games.Add(match); 
     } 
    } 

但我相信我可以擺脫那些討厭的foreach,只是使用linq。

回答

0

你的對象模型看起來的確有些奇怪,所以我認爲這可能是有些重構,但這裏是我的答案:

var query = 
    from channel in activeSoftware 
    from match in oGames.AllActive 
    where !string.IsNullOrEmpty(match.GamingProperties.UrlDirectGame) 
    where match.GamingProperties.Software.Contains(channel) 
    where match.StateProperties.Channels.Split(',').Intersect(activeChannels).Any() 
    select match; 

var games = query.ToList(); 

你也可以做到這一點,如果我正確地理解你的模型:

var query = 
    from match in oGames.AllActive 
    where !string.IsNullOrEmpty(match.GamingProperties.UrlDirectGame) 
    where match.GamingProperties.Software.Intersect(activeSoftware).Any() 
    where match.StateProperties.Channels.Split(',').Intersect(activeChannels).Any() 
    select match; 

var games = query.ToList(); 

希望有幫助。

+0

你怎麼覺得對象模型有點奇怪? – Dementic

+0

只是'match.GamingProperties.Software'&'match.StateProperties.Channels'似乎有點囉嗦,並不是很清楚它們的目的。我必須在一定程度上提供我對信仰的回​​答。 – Enigmativity

0

看起來像你的解決方案可以使用一些重構......但這裏有一些粗糙的東西給你的想法。

var new items = items.ForEach(channel => 
from g in oGames.AllActive 
where (.Where(g => !string.IsNullOrEmpty(g.GamingProperties.UrlDirectGame) && g.GamingProperties.Software.Contains(channel) && g.StateProperties.Channels.Split(',') 
    .Intersect(activeChannels).Any())))  
games.add(items); 

如果您希望我更具體,請發佈類定義。

相關問題