使用ListView时减少循环次数c#

时间:2017-02-06 15:45:33

标签: c# loops listview iteration

我有一个listView看起来像这样:

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

我想知道我是否可以在一个循环而不是两个循环中完成此操作。

由于

1 个答案:

答案 0 :(得分: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
}

这种方式(如果你恰当地命名方法),很容易理解每​​种方法的发生和目的。