2017-02-06 9 views
1

Ich habe ein Listview wie folgt aussieht:die Anzahl der Schleifen reduzieren, wenn Listview mit C#

enter image description here

und ich möchte jedes Element so viele wie in der Mengenspalte iterieren. Ich habe einen Code geschrieben, die dies tun:

  foreach (ListViewItem item in listView1.Items) 
     { 

      for (int quantity = 1; quantity < (Convert.ToInt32(item.SubItems[1].Text) + 1); quantity++) 
      { 
       //do something 
      } 
     } 

Ich bin Wunder, wenn ich das eine Schleife in nur anstelle von zwei tun können.

Dank

+0

Nun eine Schleife wäre immer noch die gleiche Anzahl von Iterationen insgesamt ... Was ist das Problem mit dem aktuellen Ansatz? Andere Optimierungen hängen davon ab, was "// etwas tun" tut. –

+0

Was ist Ihr Wunschergebnis? – nbokmans

+0

Sie können die Verschachtelung der Schleife reduzieren, indem Sie die Methode 'Select()' verwenden, die Ihnen eine Schleife gibt. Allerdings werden die Anzahl Iterationen nicht reduziert, und ich denke nicht, dass es möglich wäre, –

Antwort

1

Ich bin nicht sicher, warum Sie das tun wollen, aber wenn Sie es ist notwendig und hilft denken, könnten Sie einige Linq wie das tun:

var items = listView1.Items.OfType<ListViewItem>(); 
var query = items.SelectMany(item => 
       Enumerable.Range(1, Convert.ToInt32(item.SubItems[1].Text)) 
         .Select(i => new { Item = item, Index = i}); 
foreach(var element in query) 
{ 
    Console.WriteLine("Book: {0}, i: {1}", element.Item.Text, element.Index); 
} 

Ergebnis:

Book: book1, i: 1 
Book: book1, i: 2 
Book: book1, i: 3 
Book: book1, i: 4 
Book: book2, i: 1 
... 
Book: book2, i: 11 
Book: book3, i: 1 
... 
Book: book3, i: 13 

Aber wie Sie Lesbarkeit in einem Kommentar erwähnt, denke ich wirklich, dass Ihre zwei verschachtelte Schleifen sind genug lesbar oder zumindest lesbarer als diese Verbindung.
Und eine Anmerkung, um klar zu sein: Dies reduziert nicht die Anzahl der Iterationen, es reduziert nur die Verschachtelung von Schleifen.


Ein lesbarer Ansatz wäre einige Funktionen in zusätzliche Methoden Einkapseln:

foreach(ListViewItem item in ListViewItems) 
    HandleItem(item); 

private void HandleItem(ListViewItem item) 
{ 
    for (int i=1; i<Convert.ToInt32(item.SubItems[1].Text)+1; i++) 
     HandleItemWithIndex(item, i); 
} 
private void HandleItemWithIndex(ListViewItem item, int index) 
{ 
    // Do something 
} 

Auf diese Weise (wenn Sie die Methoden in geeigneter Weise nennen) ist es einfach, jede Methode, was passiert, und welchem ​​Zweck folgen hat.

+2

Sollte darauf hingewiesen, dass dort wird keine Reduktion von "Iterationen" sein. Es ist wirklich nur ein einziger Befehl statt zwei, aber diese Antwort ist richtig. Die Menge an Zeit zum Durchlaufen der Sammlung ändert sich nicht. – Rinktacular

+2

@Rinktacular das ist richtig, aber OP (soweit ich verstanden habe) wollte nicht die Iterationen reduzieren (er/sie will jeden Schritt), aber verschachtelte Schleifen loswerden. Aber ich habe meine Antwort mit einem besser lesbaren Ansatz aktualisiert. –

+0

Dies kann dem OP den Eindruck vermitteln, dass es jetzt weniger Iterationen gibt, obwohl es in Wirklichkeit nur eine linq-Version ist. – CodingYoshi

Verwandte Themen