【问题标题】:C# Lambda Expression not returning expected resultC# Lambda 表达式未返回预期结果
【发布时间】:2009-08-21 18:32:25
【问题描述】:

我正在使用 lamda 表达式来过滤查询。

基本上,我有由段组成的行,这些段被标记为删除、插入或空。

我想要返回的是已标记为已删除但其任何同级未标记为已删除的段。例如,

Line: "Soylent Green is people!" Broken into 2 segments... 
Segment 1: "Soylent Green " (marked as deleted)
Segment 2: "is people!" (not marked as deleted)

应该返回第 1 段。但是下一个示例,

Line: "Open the pod bay doors Hal!" Broken into 3 segments...
Segment 1: "Open the " (marked as deleted)
Segment 2: "pod bay " (marked as deleted)
Segment 3: "doors Hal!" (marked as deleted)

不应返回任何段。见以下代码:

return seg => seg.ModType == Deleted &&
              seg.Line.Segments.Any(segs => segs.ID != seg.ID && 
              segs.ModType != Deleted);

谢谢,感谢任何关于为什么这不起作用的帮助或建议。

【问题讨论】:

  • 你还没有向我们展示足够的真实性。这里的“ID”是什么?请提供一个简短但完整的程序来演示问题。我怀疑一旦我们可以重现它,我们就会很容易地找到问题。我建议使用“seg”和“segs”会造成混淆。
  • 您确定 Line.Segments 集合是正确的吗?
  • 请发布一个完整但简短的程序,可以编译和执行以重现您的问题。这将帮助我们通过向我们提供可以调试和调整的代码来帮助您,以获得所需的结果。
  • 我找到了为什么它没有返回我所期望的。 ModType 是 NULLABLE,因此,这个 sn-p 的代码应该是这样的... [code] return seg => seg.ModType == Deleted && seg.Line.Segments.Any(segs => segs.ID != seg .ID && (segs.ModType != 已删除 || segs.ModType == null)); [code] 感谢所有 cmets!

标签: c# linq linq-to-sql lambda


【解决方案1】:

我想应该是这样的:

return s =>  from segment in s.Line.Segments 
             where segment.ModType == Deleted 
                && segment.Line.Segments.Any(segs => segs.ModType != Deleted)
             select segment

【讨论】:

  • Any 返回一个bool,而不是一个集合。
  • 这将返回一个将在查询中使用的 Lambda 表达式。
【解决方案2】:

使用 Where() 代替 Any(),它将返回一个 IEnumerable 对象。正如 Jon 所说, Any() 返回一个布尔值。

【讨论】:

    【解决方案3】:

    由于 ModType 可以为空,它没有返回我所期望的。代码应该是...

    return seg => seg.ModType == Deleted &&
              seg.Line.Segments.Any(segs => segs.ID != seg.ID && 
              (segs.ModType != Deleted || segs.ModType == null));
    

    感谢所有回复并给予cmets和建议的人!

    【讨论】:

      猜你喜欢
      • 2011-10-03
      • 2015-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-09
      相关资源
      最近更新 更多