Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Löschen in einer "for in" Schleife (https://www.delphipraxis.net/178055-loeschen-einer-schleife.html)

Mikkey 15. Dez 2013 13:14

AW: Löschen in einer "for in" Schleife
 
Zitat:

Zitat von Furtbichler (Beitrag 1239803)
Code:
foreach (var item in myEnumerable.Where(ItemIsNotValidAnymore))
{
  myEnumerable.Remove(item);
}
...
bool ItemIsNotValidAnymore(MyEnumerableElement item)
{
 ...
}
Da braucht man noch nicht einmal mehr Kommentare.

Wenn Du den Inhalt von ItemIsNotValidAnymore noch in die Klammern hinter das Where schreibst:

Code:
foreach (var item in myEnumerable.Where({
 ...
}))
{
  myEnumerable.Remove(item);
}
so dass perfektes C# herauskommt, weiß somit jeder, was dabei abläuft.

Furtbichler 15. Dez 2013 15:21

AW: Löschen in einer "for in" Schleife
 
Zitat:

Zitat von Mikkey (Beitrag 1239834)
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).


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:42 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz