将项目划分为列
本文关键字:划分 项目 | 更新日期: 2023-09-27 18:35:53
我有一个动态数量的项目要分成最多 4 列,然后使用正确的 html 格式,让我们说:
string[] s = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; // from 1 to n itens
要格式化为此 html:
<ul>
<li>
1
2
3
</li>
<li>
4
5
</li>
<li>
6
7
</li>
<li>
8
9
</li>
</ul>
编辑:我的网站问题:
如果你有单词作为 itens,以这种方式放置 itens 会将单词组织成按字母顺序排列的列(人们以这种方式阅读),而不是按字母顺序排列。喜欢:
a d g i
b e h j
c f
而不是:
a b c d
e f g h
i j
假设你想均匀分布任何余数,这将完成这项工作:
string[] s = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
// create the 4 buckets with equal distribution
var buckets = Enumerable.Repeat(s.Length / 4, 4).ToArray();
// distribute any remainders evenly starting from the first bucket
var rem = s.Length % 4;
for (var i = 0; i < rem; i++) buckets[i]++;
var idx = 0;
Console.WriteLine("<ul>");
foreach (var bucket in buckets)
{
Console.WriteLine("'t<li>");
foreach (var _ in Enumerable.Range(1, bucket))
{
Console.WriteLine("'t't{0}", s[idx++]);
}
Console.WriteLine("'t</li>");
}
Console.WriteLine("</ul>");
对于上面的代码,下面是一些边缘情况返回的内容。
{}
= 列表中有 4 个空项目
{ "1", "2", "3"}
= 前三项中的 1、2、3,第四项为空
{ "1", "2", "3", "4", "5"}
= 第一项中的 1, 2,其他项中的 3, 4, 5
只需遍历分布数组项的数组,其中包含一些 if 语句。
int j = 0;
for (int i = 0; i < s.Length; i++)
{
if (j == 0)
// put s[i] in column 1 j = j +1
else if (j == 1)
// put s[i] in column 2 j = j +1
else if (j == 2)
// put s[i] in column 3 j = j +1
if (j == 3)
// put s[i] in column 4 set j = 0
}
既然你想按列而不是行分组,只要意识到你最终将不得不对索引做一些事情。最简单的方法是将项目转换为项目/索引对,并以某种方式按这些索引进行分组。
s.Select((tr, ti) => new { Index = ti, Item = tr })
.GroupBy(tr => tr.Index % SOME_MAGIC_NUMBER)
如果要改为按行分组,请将%
运算符更改为除法/
,即可设置。现在,这将获取所有项目并将它们分组到您指定的任意数量的项目中(基于行或列)。要转换它们,您所要做的就是另一个选择:
.Select(tr => "<li>" + string.Join(" ", tr.Select(tstr => tstr.Item.ToString()).ToArray()) + "</li>")
这将以您想要的任何格式为您提供所有列表项的列表。如果要在每个<li>
的元素之间包含<br />
,则只需更改string.Join
调用的第一个参数即可。