3

我有一个动态数量的项目,最多分为 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
4

3 回答 3

5

假设您想平均分配任何剩余部分,这将完成这项工作:

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

于 2012-05-30T21:52:12.597 回答
1

Just loop over the array distributing the array items with a few if statements within it.

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
}
于 2012-05-30T21:46:04.663 回答
1

由于您想按列而不是按行进行分组,因此请意识到您最终将不得不对索引进行一些操作。最简单的方法是将项目转换为项目/索引对,并以某种方式按这些索引分组。

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>")

这将以您想要的任何格式为您提供所有列表项的列表。如果你想<br />在每个元素之间包含,<li>那么只需更改string.Join调用的第一个参数。

于 2012-05-30T21:57:41.097 回答