【问题标题】:Linq - where not in comma separated listLinq - 不在逗号分隔列表中
【发布时间】:2011-07-14 10:14:23
【问题描述】:

我有一个名为 game 的对象,它有一个名为 channels 的属性(用逗号分隔,因为游戏可以与多个频道相关)。

我还有一个通道对象,它包含一个名为 isActive 的属性。

我需要的是一种获取所有具有活跃频道的游戏的方法。

我开始写这个:

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

但是被屏蔽了……谁能帮帮我?

【问题讨论】:

  • 好吧,首先 .Contains 只接受字符串(不接受通道对象),如果我将转换结果数组,那么 .Contains 仍会将 g.stateproperties.channels 中出现的确切字符串与来自 .channels.all....的确切结果....
  • 当您可以使用 real List 时,为什么还要保留“逗号分隔列表”又名字符串?有理由在 C# 中编写字符串类型的代码吗?
  • 即使你是对的,我也无法在经过 5 年的发展后去改变整个工作模式。

标签: c# linq


【解决方案1】:
var oGames = games.AllActive
    .Where(g => g.StateProperties.Channels.Split(',')
                 .Intersect(channels.Where(c => c.StateProperties.IsActive)
                                    .Select(c => c.Name)).Any());

我强烈建议不要使用包含频道名称的 csv,而是存储对它们的引用。

这将大大简化代码。使用字典将字符串映射到频道也会有所帮助。

【讨论】:

  • 方法 'System.Linq.Enumerable.Intersect(System.Collections.Generic.IEnumerable, System.Collections.Generic.IEnumerable)' 的类型参数不能是从用法推断。尝试明确指定类型参数。
  • 您可能需要根据定义频道名称的属性更改.Select(c => c.Name)
  • 我确实更改了它( .Guid ),因为那是 .channels 中出现的内容
  • @Dementic:即使此解决方案适用于您的情况,我认为您的 game.channels 属性应该是 IList,而不是字符串。这样,更面向对象,您可以更轻松地执行 Linq 查询。
  • Where 需要一个谓词。我给Any添加了一个电话。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-03
相关资源
最近更新 更多