C# 确定有多少行,以及每行有多少项
这不是一个复杂的问题,但无论出于什么原因,我都无法想出一个简单的方法来使用模运算符来实现这一点。基本上,我有一个N个项目的集合,我想在网格中显示它们 我最多可以显示3条横条和无限条竖条;它们不是固定宽度的……因此,如果我有两个项目,它们会像那样显示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] 七个项目稍微
[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)除非是唯一的项目,否则不能有一行有单个项目,我认为算法如下:
if ((list.Count % 2) == 0)
{
//Display all as [][]
[][]
}
else
{
//Display all as [][]
[][]
//Display last 3 as [][][]
}
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个项目的示例,流程如下所示:
我想那会有用的。至少,在上午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个项目的示例,流程如下所示:
我想那会有用的。至少,在上午12:30,它似乎应该可以工作。最后一行是否完全填充是另一个标准?否则,为什么7项不是1 2 3 \n 4 5 6 \n 7为什么不在每行中放3项(mod 3 all t