AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Löschen in einer "for in" Schleife

Ein Thema von dominikkv · begonnen am 14. Dez 2013 · letzter Beitrag vom 15. Dez 2013
Antwort Antwort
Seite 2 von 2     12
Mikkey

Registriert seit: 5. Aug 2013
265 Beiträge
 
#11

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

  Alt 15. Dez 2013, 13:14
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.
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#12

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

  Alt 15. Dez 2013, 15:21
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).
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:16 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz