Я не уверен, почему вы хотите сделать это, но если вы думаете, что это необходимо и помогает, вы могли бы сделать некоторые 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
}
Этот способ (если вы называете методы должным образом) легко следовать, что происходит и с какой целью каждый метод есть.
Ну, в одном цикле все равно будет одинаковое количество итераций ... в чем проблема с нынешним подходом? Другие оптимизации будут зависеть от того, что делает «// что-то». –
Каков ваш желаемый результат? – nbokmans
Вы можете уменьшить вложение петли, используя метод 'Select()', который фактически даст вам один цикл. Однако число итераций не будет уменьшено, и я не думаю, что это возможно. –