выбор элементов из списка с помощью linq, где элементы появляются в двух других списках - PullRequest
0 голосов
/ 01 августа 2011

У меня есть два списка, которые содержат направляющие:

    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 - список разделенных запятыми указателей

да, я знаю, что нехорошо сохранять значения через запятую в поле, но я не могу изменить его в данный момент (он уже работает на 40+ сайтах)

что я хочу сделать, это выбрать все игры, в которых программное обеспечение активно (сравнивая softwarelist с game.gamingproperties.software) и что каналы, в которых они отображаются, активны (проверяя, содержит ли game.stateproperties.channels какой-либо из activechannels направляющих)

Первоначально я сделал это так:

    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.

Ответы [ 2 ]

0 голосов
/ 01 августа 2011

Ваша объектная модель выглядит немного странно, поэтому я думаю, что ее можно несколько реорганизовать, но вот мой ответ:

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 голосов
/ 01 августа 2011

похоже, что ваше решение могло бы использовать некоторый рефакторинг ... но вот кое-что грубое, чтобы дать вам идею.

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);

пожалуйста, опишите определения классов, если вы хотите, чтобы я был более конкретным.

...