【问题标题】:Nested Loop Counter嵌套循环计数器
【发布时间】:2020-10-30 03:44:56
【问题描述】:

我正在尝试创建一个嵌套循环,它采用给定的数字“每张视图”,根据这个数字,让我们从 (1) 开始计算 00,01,02,03,04,05,06。 .. 现在如果数字是 (2) 将计数 00,00,01,01,02,02 现在的数字是 (3) 将计数 00,00,00,01,01,01

我已经尝试了以下代码的许多变体,但我粘贴的并不是最接近我想要的结果,但我脑子很糊,似乎无法弄清楚什么似乎是一个简单的操作。我的谷歌搜索词不能很好地找到比较。

请查看附件图片以了解我想要做什么。

编辑... 表单是 Telerik 的 radGridView

public void ViewsPerSheetChange(object sender, EventArgs e)
{
    int numViewsPerSheet = (int)thisForm.numViewsPerSheet.Value;
    
    for (int i = 0; i < numViewsPerSheet; i++)
    {
        for (int j = 0; j < Models.Count; j++)
        {
            Models[j].SheetObjModel.SheetNumber = i.ToString().PadLeft(2, '0');
            if (j == numViewsPerSheet - 1)
            {
                break;
            }
        }
    }
    thisForm.RefreshDataGrid();
}

【问题讨论】:

  • 你只需要一个循环和一个 sheetIndex。仅当 i%NumViewsPerSheet == 0 时才增加 sheetIndex。
  • 项目数不能除以张数怎么办?
  • @Fildor 所说的将起作用 - 只需使用模运算符..
  • Olivier,我的问题怎么不清楚,或者错过了目标或困难?到目前为止我做了什么?向下箭头表示“没有显示足够的研究”,如何衡量研究?这似乎是一个样板反应。我的问题成功地得到了两个理解我所问内容的人的两个非常好的答复。所以我对你的评论感到很困惑。对于我在本网站上的下一个问题,我会留意您的评论。谢谢
  • @Olivier,我已按要求编辑并向 Telerik radgridview 添加了一个标签。一个通用的抄送...我知道... :-)

标签: c# winforms radgridview


【解决方案1】:

你几乎拥有它。您在这里并不需要嵌套循环。对工作表编号使用整数除法。我重复相同的数字x 次数,其中x 是每张纸的查看次数。

试试:

    public void ViewsPerSheetChange(object sender, EventArgs e)
    {
        int numViewsPerSheet = (int)thisForm.numViewsPerSheet.Value;

        for (int j = 0; j < Models.Count; j++)
        {
            int i = j/numViewsPerSheet; // 0,0,0,1,1,1,2,2,2... for num=3
            Models[j].SheetObjModel.SheetNumber = i.ToString().PadLeft(2, '0');          
        }
        thisForm.RefreshDataGrid();
    }

【讨论】:

    【解决方案2】:

    使用模运算符的示例:

    using System;
                        
    public class Program
    {
        public static void Main()
        {
            int numViewsPerSheet = 2;
            int sheetIndex = 0;
            for ( int i = 0 ; i < 7; i++ )
            {
                Console.WriteLine("Sheet: {0:00}", sheetIndex);
                if( (i+1)%numViewsPerSheet==0)sheetIndex++;
            }
        }
    }
    

    见https://dotnetfiddle.net/xnCMts

    结果:

    表:00 表:00 表:01 表:01 表:02 表:02 表:03

    适应您的代码:

    public void ViewsPerSheetChange(object sender, EventArgs e)
    {
        int viewIndex = 0;
        int numViewsPerSheet = Math.Max((int)thisForm.numViewsPerSheet.Value, 1); // never trust user input!
    
        for (int i = 0; i < Models.Count; i++) {
            Models[i].SheetObjModel.SheetNumber = viewIndex.ToString("00");
            if ( (i+1)%numViewsPerSheet==0) viewIndex++;
        }
        thisForm.RefreshDataGrid();
    }
    

    【讨论】:

      【解决方案3】:

      感谢您的回复,您的示例非常有帮助,我设法使其与 while 循环一起工作。

      public void ViewsPerSheetChange(object sender, EventArgs e)
          {
              int numViewsPerSheet = (int)thisForm.numViewsPerSheet.Value;
      
              int cnt = 0;
              int num = 0;
              if (numViewsPerSheet < 1)
              {
                  return;
              }
              while (cnt < Models.Count)
              {
                  for (int i = 0; i < numViewsPerSheet; i++)
                  {
                      Models[cnt].SheetObjModel.SheetNumber = num.ToString().PadLeft(2, '0');
                      cnt++;
                      if (cnt == Models.Count) break;
                      
                  }
                  num++;
              }
          thisForm.RefreshDataGrid();
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-01
        • 2013-05-09
        • 2021-10-08
        • 2012-12-01
        • 1970-01-01
        • 2021-10-23
        相关资源
        最近更新 更多