2017-02-06 4 views
1

У меня есть ListView выглядит следующим образом:уменьшить количество петель при использовании ListView C#

enter image description here

, и я хотел бы повторять каждый пункт, как многие, как и в колонке количества. Я написал код, который это сделать:

  foreach (ListViewItem item in listView1.Items) 
     { 

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

Я интересно, если я могу сделать это только в одном цикле вместо двух.

Благодаря

+0

Ну, в одном цикле все равно будет одинаковое количество итераций ... в чем проблема с нынешним подходом? Другие оптимизации будут зависеть от того, что делает «// что-то». –

+0

Каков ваш желаемый результат? – nbokmans

+0

Вы можете уменьшить вложение петли, используя метод 'Select()', который фактически даст вам один цикл. Однако число итераций не будет уменьшено, и я не думаю, что это возможно. –

ответ

1

Я не уверен, почему вы хотите сделать это, но если вы думаете, что это необходимо и помогает, вы могли бы сделать некоторые LINQ так:

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

Результат:

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 

Но, как вы упоминаете читаемость в комментарии, я действительно думаю, что ваши две вложенные петли достаточно читаемы или, по крайней мере, более читабельны, чем эта ссылка.
И примечание должно быть ясным: это не уменьшает число итераций, оно просто уменьшает вложенность циклов.


Более читаемый подход был бы герметизирующего некоторые функциональные возможности в дополнительных методов:

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 
} 

Этот способ (если вы называете методы должным образом) легко следовать, что происходит и с какой целью каждый метод есть.

+2

Следует отметить, что там не будет сокращения «итераций». На самом деле это просто одна команда, а не две, но этот ответ правильный. Количество времени, затрачиваемого на цикл, не изменяется. – Rinktacular

+2

@ Rinktacular это правильно, но OP (насколько я понял) не хотел уменьшать итерации (он/она хочет делать каждый шаг), но избавиться от вложенных циклов. Но я обновил свой ответ тем, что, по моему мнению, является более читаемым. –

+0

Это может дать OP впечатление, что сейчас меньше итераций, когда на самом деле это просто версия linq. – CodingYoshi

Смежные вопросы