【问题标题】:reduce the number of loops when using ListView c#使用 ListView c# 时减少循环次数
【发布时间】:2017-06-23 15:06:49
【问题描述】:

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

我想在数量列中迭代每个项目。我已经写了一个代码来做到这一点:

            foreach (ListViewItem item in listView1.Items)
        {

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

我想知道我是否可以只用一个循环而不是两个循环来做到这一点。

谢谢

【问题讨论】:

  • 那么一个循环的总迭代次数仍然相同......当前方法有什么问题?其他优化将取决于 //do something 的作用。
  • 你想要的结果是什么?
  • 您可以使用Select() 方法减少循环嵌套,这实际上会给您一个循环。但是,迭代次数不会减少,我认为不可能
  • @AlexK。是的,我知道,但问题是我的程序有太多循环并且难以遵循。我的大部分循环都依赖于 ListView。
  • 我建议您使用 ListView 来显示一些实体。但是如果你需要计算一些东西,那么使用实体而不是使用这些实体绑定到的 UI 控件

标签: c# loops listview iteration


【解决方案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
}

这样(如果您适当地命名方法)很容易了解发生的情况以及每个方法的用途。

【讨论】:

  • 应该注意的是不会减少“迭代”。它实际上只是使它成为一个命令而不是两个,但是这个答案是正确的。循环遍历集合的时间量不会改变。
  • @Rinktacular 是正确的,但 OP(据我了解)不想减少迭代(他/她想要做每一步),而是摆脱嵌套循环。但我用我认为更易读的方法更新了我的答案。
  • 这可能会给 OP 一种印象,即现在迭代次数减少了,而实际上它只是一个 linq 版本。
  • 哦,我同意你的看法,我只是想向任何可能认为这种方式“更快”的人说清楚
  • @CodingYoshi 再次,问题是“一个循环而不是两个”,而不是“如何用更少的迭代实现相同数量的迭代”。我没有假装迭代次数减少了,而是发布了结果以表明迭代次数相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 2021-03-18
  • 1970-01-01
  • 1970-01-01
  • 2021-04-23
相关资源
最近更新 更多