Wenn Du den Inhalt von ItemIsNotValidAnymore noch in die Klammern hinter das Where schreibst:
...
so dass perfektes C# herauskommt, weiß somit jeder, was dabei abläuft.
Ich weiß jetzt nicht, was Du mit geschweiften Klammern meinst... einen Lambda Ausdruck? der hat doch gar keine... Aber egal, es war vorher auch perfektes C# (hat zumindest mein VS gesagt).
Meinst Du so?
Code:
// Mikkey-Style:
foreach (var item in myEnumerable.Where(x=>(x.Foobar < 3 || !(x.Age > 65 && x.Status != Status.ManagementItem)
&&) x.MoreStuffToCheck > somethingElse))
{
myEnumerable.Remove(item);
}
Dein Ansatz verstößt gegen das
SLA-Prinzip. Was bedeutet das? Mit einem Lambda-Ausdruck wird es schnell unleserlich, weil man sich erst erarbeiten muss, was der Ausdruck bewirken soll. Mit einer benannten Methode (die sich damit selbst kommentiert) ergibt sich der Sinn sofort.(Siehe auch
Clean Code).
Man muss doch beim Lesen des Codes gar nicht genau wissen, weshalb gelöscht wird (Level of abstraction, siehe oben). Wichtig ist, das es gemacht wird, weil die Einträge nicht mehr gültig sind. Das ergibt sich bei Clean-Code *sofort*.
Bei deiner Variante muss man sich das erst mühsamm erarbeiten. Wieso soll denn gelöscht werden, wenn FooBar < 3? Oder wenn Age>65 und der Status != ManagementItem, aber in beiden Fällen auf jeden Fall 'MoreStuffToCheck>somethingElse sein muß? Verstehst Du das? Nö, ne? Aber 'ItemIsNotValidAnymore'(*) ist dann vielleicht doch ein wenig einfacher, meinst Du nicht?
(*) Wobei man im konreten Fall natürlich einen etwas konkreteren Namen angeben sollte. Hier war das nur zu allgemeinen Verständnis etwas allgemein gehalten.
Komplexer Code ist nicht erstrebenswert (KISS-Prinzip).