C# 确定有多少行,以及每行有多少项

C# 确定有多少行,以及每行有多少项,c#,c#-4.0,C#,C# 4.0,这不是一个复杂的问题,但无论出于什么原因,我都无法想出一个简单的方法来使用模运算符来实现这一点。基本上,我有一个N个项目的集合,我想在网格中显示它们 我最多可以显示3条横条和无限条竖条;它们不是固定宽度的……因此,如果我有两个项目,它们会像那样显示[1][2]。如果我有4个项目,它们将按如下方式堆叠显示: [1][2] [3][4] [ 1 ][ 2] [3][4][5] 如果我有5个项目,它应该是这样的: [1][2] [3][4] [ 1 ][ 2] [3][4][5] 七个项目稍微

这不是一个复杂的问题,但无论出于什么原因,我都无法想出一个简单的方法来使用模运算符来实现这一点。基本上,我有一个N个项目的集合,我想在网格中显示它们

我最多可以显示3条横条和无限条竖条;它们不是固定宽度的……因此,如果我有两个项目,它们会像那样显示
[1][2]
。如果我有4个项目,它们将按如下方式堆叠显示:

[1][2]
[3][4]
[ 1 ][ 2]
[3][4][5]
如果我有5个项目,它应该是这样的:

[1][2]
[3][4]
[ 1 ][ 2]
[3][4][5]
七个项目稍微复杂一些:

[ 1 ][ 2]
[ 3 ][ 4]
[5][6][7]
这是其中的一件事,如果我睡在上面,早上很明显会脑死亡,但我所能想到的只是复杂的循环和状态变量。必须有一个更简单的方法

我用C#做这件事,但我怀疑语言的重要性。

因此,考虑到:a)目标是最小化行数,b)一行不能有超过3个项目,C)一行如果可能应该有3个项目,以及d)除非是唯一的项目,否则不能有一行有单个项目,我认为算法如下:

  • 如果只有一个项目,则它将单独位于自己的行中;完成了
  • 将项目数除以3,计算“暂定”行数
  • 如果余数(N%3)为0,则所有行将有3项
  • 如果余数为1,则将有一个额外的行,最后两行每行仅包含2项
  • 如果余数是2,那么将有一个额外的行,并且它将只有2项
  • 此算法将生成与您设想的格式稍有不同的格式(3项行位于顶部,2项行位于底部),但它满足约束条件。如果需要将两个项目的行放在顶部,可以对其进行修改。

    因此,考虑到:a)目标是最小化行数,b)一行不能有超过3个项目,c)如果可能,一行应该有3个项目,以及d)除非是唯一的项目,否则不能有一行有单个项目,我认为算法如下:

    if ((list.Count % 2) == 0)
    {
     //Display all as [][]
                      [][]
    }
    else
    {
    //Display all as    [][]
                        [][]
    //Display last 3 as [][][]
    }
    
  • 如果只有一个项目,则它将单独位于自己的行中;完成了
  • 将项目数除以3,计算“暂定”行数
  • 如果余数(N%3)为0,则所有行将有3项
  • 如果余数为1,则将有一个额外的行,最后两行每行仅包含2项
  • 如果余数是2,那么将有一个额外的行,并且它将只有2项
  • 此算法将生成与您设想的格式稍有不同的格式(3项行位于顶部,2项行位于底部),但它满足约束条件。如果需要将两项行放在顶部,可以对其进行修改。

    伪代码如何

    if ((list.Count % 2) == 0)
    {
     //Display all as [][]
                      [][]
    }
    else
    {
    //Display all as    [][]
                        [][]
    //Display last 3 as [][][]
    }
    
    if n mod 3 = 1
      first 2 rows have 2 items each (assuming n >= 4)
      all remaining rows have 3 items
    
    else if n mod 3 = 2
      first row has 2 items
      all remaining rows have 3 items
    
    else
      all rows have 3 items
    
    伪代码呢

    if n mod 3 = 1
      first 2 rows have 2 items each (assuming n >= 4)
      all remaining rows have 3 items
    
    else if n mod 3 = 2
      first row has 2 items
      all remaining rows have 3 items
    
    else
      all rows have 3 items
    

    通过最大化包含三个项目的行数,可以最小化总行数。因此,六个项目将分为两行3,而不是三行2:

    [1][2][3]
    [4][5][6]
    
    [ 1 ][ 2 ]
    [ 3 ][ 4 ]
    [5][6][7 ]
    [8][9][10]
    
    十个项目将分为两行2和两行3,而不是五行2:

    [1][2][3]
    [4][5][6]
    
    [ 1 ][ 2 ]
    [ 3 ][ 4 ]
    [5][6][7 ]
    [8][9][10]
    
    如果希望行中首先包含两个项目,则继续剥离两个项目,直到剩余的项目可以被3整除。在循环过程中,您需要使用索引或诸如此类的方法来跟踪剩余项目的数量

    在填充每行的循环中,可以检查以下条件:

    //logic within loop iteration
    if (remaining % 3 == 0) //take remaining in threes; break the loop
    else if (remaining >= 4) //take two items, leaving two or more remaining
    else //take remaining items, which will be two or three; break the loop
    
    如果我们浏览10个项目的示例,流程如下所示:

  • 剩余10项。10 % 3 != 0因为10>4,所以取两个项目
  • 剩余8项。8 % 3 != 0因为8>4,所以取两个项目
  • 剩余6项。6 % 3 = 0. 将这6个项目分成三组
  • 要查看您的7项示例,请执行以下操作:

  • 剩余7项。7 % 3 != 0因为7>4,所以取两个项目
  • 剩余5项。5 % 3 != 0因为5>4,所以取两个项目
  • 剩余3项。3 % 3 = 0. 将这3项作为一组
  • 以下是4项的结果:

  • 剩余4项。4 % 3 != 0因为剩余=4,所以取两个项目
  • 剩余2项。2 % 3 != 02 < 4. 降到其他状态,拿走剩余物品

  • 我想那会有用的。至少,在上午12:30,它似乎应该可以工作。

    通过最大化包含三个项目的行数,您可以最小化总行数。因此,六个项目将分为两行3,而不是三行2:

    [1][2][3]
    [4][5][6]
    
    [ 1 ][ 2 ]
    [ 3 ][ 4 ]
    [5][6][7 ]
    [8][9][10]
    
    十个项目将分为两行2和两行3,而不是五行2:

    [1][2][3]
    [4][5][6]
    
    [ 1 ][ 2 ]
    [ 3 ][ 4 ]
    [5][6][7 ]
    [8][9][10]
    
    如果希望行中首先包含两个项目,则继续剥离两个项目,直到剩余的项目可以被3整除。在循环过程中,您需要使用索引或诸如此类的方法来跟踪剩余项目的数量

    在填充每行的循环中,可以检查以下条件:

    //logic within loop iteration
    if (remaining % 3 == 0) //take remaining in threes; break the loop
    else if (remaining >= 4) //take two items, leaving two or more remaining
    else //take remaining items, which will be two or three; break the loop
    
    如果我们浏览10个项目的示例,流程如下所示:

  • 剩余10项。10 % 3 != 0因为10>4,所以取两个项目
  • 剩余8项。8 % 3 != 0因为8>4,所以取两个项目
  • 剩余6项。6 % 3 = 0. 将这6个项目分成三组
  • 要查看您的7项示例,请执行以下操作:

  • 剩余7项。7 % 3 != 0因为7>4,所以取两个项目
  • 剩余5项。5 % 3 != 0因为5>4,所以取两个项目
  • 剩余3项。3 % 3 = 0. 将这3项作为一组
  • 以下是4项的结果:

  • 剩余4项。4 % 3 != 0因为剩余=4,所以取两个项目
  • 剩余2项。2 % 3 != 02 < 4. 降到其他状态,拿走剩余物品

  • 我想那会有用的。至少,在上午12:30,它似乎应该可以工作。

    最后一行是否完全填充是另一个标准?否则,为什么7项不是1 2 3 \n 4 5 6 \n 7为什么不在每行中放3项(mod 3 all t