具有特殊组分组和过滤的LINQ查询

Sla*_*uma 5 .net c# linq

我上课了......

class Document
{
    public int GroupID  { get; set; }
    public bool Valid { get; set; }
    // more
}
Run Code Online (Sandbox Code Playgroud)

......以及实例列表:IEnumerable<Document> documents.在通过此列表逐个对象运行的第一步中,这些文档已经过验证,这意味着:该属性Validtrue用于某些对象和false列表中的其他对象.

现在,在第二步中,我必须执行以下操作:

  • 如果每个文档组的至少一个文档(由所有文档具有相同的定义GroupID)该标志Validfalse然后设置Validfalse该组的所有文档.

为此,我创建了以下代码片段:

var q = from d in documents
        group d by d.GroupID;
// q is now of type IEnumerable<IGrouping<int, Document>>

foreach (var dg in q) // dg = "document group", of type IGrouping<int, Document>
{
    if (dg.Any(d => !d.Valid))
    {
        foreach (var d in dg)
            d.Valid = false;
    }
}
Run Code Online (Sandbox Code Playgroud)

我相信,这就是我想要的(我直到现在都没有测试过),但效率不高.

问题:有没有办法改进这个代码,特别是将Any外部foreach循环中的方法的语义"以某种方式"移动到初始LINQ查询中,这样q只表示至少有一个无效文档的组?(此外,我显然对只有一个元素的组不感兴趣,因此这些组也可以被过滤掉.)

提前感谢您的建议!

kev*_*v22 5

我认为这样做你想要的:

var q = from d in documents
        group d by d.GroupID into g
        where g.Count() > 1 && g.Any(d => !d.Valid)
        select g;

foreach (var dg in q)
{
    foreach (var d in dg)
    {
        d.Valid = false;
    }
}
Run Code Online (Sandbox Code Playgroud)

流畅语法的顶部部分如下所示:

var q = documents.GroupBy(d => d.GroupID)
            .Where(g => g.Count() > 1 && g.Any(d => !d.Valid));
Run Code Online (Sandbox Code Playgroud)