Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 减少使用ListView c时的循环数#_C#_Loops_Listview_Iteration - Fatal编程技术网

C# 减少使用ListView c时的循环数#

C# 减少使用ListView c时的循环数#,c#,loops,listview,iteration,C#,Loops,Listview,Iteration,我有一个列表视图,如下所示: 我想重复每一项,重复数量列中的每一项。我已经编写了一个代码来实现这一点: foreach (ListViewItem item in listView1.Items) { for (int quantity = 1; quantity < (Convert.ToInt32(item.SubItems[1].Text) + 1); quantity++) {

我有一个列表视图,如下所示:

我想重复每一项,重复数量列中的每一项。我已经编写了一个代码来实现这一点:

            foreach (ListViewItem item in listView1.Items)
        {

            for (int quantity = 1; quantity < (Convert.ToInt32(item.SubItems[1].Text) + 1); quantity++)
            {
                 //do something
            }
        }
foreach(listView1.Items中的ListViewItem项)
{
对于(整数数量=1;数量<(将.ToInt32(项.子项[1].文本)+1)转换为整数数量++)
{
//做点什么
}
}
我想知道我是否可以只用一个循环而不是两个循环


谢谢

我不知道你为什么要这样做,但是如果你认为这是必要的并且有帮助的话,你可以这样做:

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);
}
但正如您在评论中提到的End可读性,我真的认为您的两个嵌套循环足够可读,或者至少比这个链接更可读。
需要说明的是:这并没有减少迭代次数,只是减少了循环的嵌套


更具可读性的方法是将一些功能封装在额外的方法中:

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
}
foreach(ListViewItems中的ListViewItem项)
HandleItem(项目);
私有无效HandleItem(ListViewItem项目)
{

对于(int i=1;我认为一个循环的总迭代次数仍然是相同的…当前方法有什么问题?其他优化将取决于
//做某事
做什么。您期望的结果是什么?您可以使用
Select()减少循环嵌套
method,它实际上会给您一个循环。但是,迭代次数不会减少,我认为不会possible@AlexK.是的,我知道,但问题是我的程序有太多循环,很难遵循。我的大多数循环依赖于ListView。我建议您使用ListView来显示一些实体。但是如果您需要计算一些东西,然后使用实体,而不是使用那些实体绑定到的UI控件。请注意,不会减少“迭代次数”它实际上只是将它变成一个命令而不是两个命令,但这个答案是正确的。循环集合的时间量没有改变。@RinkTaguar这是正确的,但OP(据我所知)不想减少迭代次数(他/她想做每一步),但要去掉嵌套循环。但我用我认为更可读的方法更新了我的答案。这可能会给OP留下这样的印象,即现在迭代次数更少,而实际上它只是linq版本。哦,我同意你的看法,我只是想让相信这种方法“更快”的人明白@再一次,问题是“一个循环而不是两个”,而不是“如何用更少的迭代实现相同的迭代次数”。我没有假装迭代次数更少,而是发布了结果,以表明迭代次数相同。
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
}