2011-07-14 116 views
1

我有一个名为game的对象,它具有一个名为channels的属性(由于游戏涉及多于一个通道,所以逗号分隔)。Linq - 不用逗号分隔的列表

我也有一个通道对象,其中包含一个名为isActive的属性。

我需要的是一种让所有具有活动频道的游戏的方法。

我开始写这篇:

var oGames = games.AllActive.Where(
    g => !g.StateProperties.Channels.Contains(
     channels.All.Where(c => c.StateProperties.IsActive).ToArray() 
    ); 

,但得到受阻......任何人都可以帮我吗?

+3

你的问题是什么? –

+0

好吧,首先.Contains只接受字符串(不是通道对象),如果我要转换结果Array,那么.Contains仍然会将出现在g.stateproperties.channels中的确切字符串与来自.channels的确切结果进行比较.all .... – Dementic

+0

当你可以使用* real *'List'时,为什么要保留一个“逗号分隔列表”又名字符串?有没有理由在C#中编写字符串类型的代码? –

回答

5
var oGames = games.AllActive 
    .Where(g => g.StateProperties.Channels.Split(',') 
       .Intersect(channels.Where(c => c.StateProperties.IsActive) 
            .Select(c => c.Name)).Any()); 

我强烈建议从csv的频道名称中移开,而不是存储对它们的引用。

这将简化代码相当多。使用将字符串映射到通道的字典也会有所帮助。

+0

方法'System.Linq.Enumerable.Intersect (System.Collections.Generic.IEnumerable ,System.Collections.Generic.IEnumerable )'的类型参数不能从使用情况中推断出来。尝试明确指定类型参数。 – Dementic

+0

您可能需要根据属性定义您的频道名称来更改'.Select(c => c.Name)'。 –

+0

我确实改变了它(.Guid),因为那是出现在.channels – Dementic