Запрос LINQ с группировкой и фильтрацией специальных групп

У меня есть класс ...

class Document
{
    public int GroupID  { get; set; }
    public bool Valid { get; set; }
    // more
}

... и список экземпляров: IEnumerable документы . На первом этапе, который запускает объект за объектом через этот список, эти документы были проверены, что означает: свойство Valid будет true для некоторых объектов и false для других объектов в списке.

Теперь на втором этапе я должен сделать следующее:

  • Если хотя бы для одного документа на группу документов (определяется всеми документами с одинаковым GroupID ) флаг Допустимый - ложный , затем установите Действительный на ложный для всех документов группы.

Для этого я создал пока что следующий фрагмент кода:

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

Полагаю, это делает то, что я хочу (хотя я не тестировал его до сих пор), но не очень эффективно.

Вопрос: Есть ли способ улучшить этот код, особенно переместить семантику Any во внешнем цикле foreach «каким-то образом» в исходный запрос LINQ, так что q представляет только группы, в которых есть хотя бы один недопустимый документ? (Также меня явно не интересуют группы, в которых есть только один элемент, поэтому эти группы тоже можно отфильтровать.)

Заранее благодарим вас за предложения!

5
задан Slauma 9 November 2010 в 15:47
поделиться