我的主题数据如下所示:

010000 <- Top level header
010100 A <- Sub level header
010101 B <- Clickable item in the select list
010102 C <- Clickable item in the select list
010103 D <- Clickable item in the select list
010200 E <- Sub level header
010201 F <- Clickable item in the select list
010202 G <- Clickable item in the select list


目前,我正在使用以下代码制作一个显示所有内容的选择列表:

var topics = contentService.Get(accountID + "06000").OrderBy(o => o.Order);
foreach (Content topic in topics) {
    txt += "<option value='" + topic.RowKey + "'>" + topic.Name + "</option>\n";
}


有没有一种方法可以更改此设置,以便:


顶级标题不是选择列表的一部分吗?换句话说,以“ 0000”结尾的每一行都不会放入topic变量中。
子级别标题在选择列表中显示为组。


像这样的团体:

<select>
  <optgroup label="A">
      <option value="010101">B</option>
      <option value="010102">C</option>
      <option value="010103">D</option>
  </optgroup>
  <optgroup label="E">
      <option value="010201">F</option>
      <option value="010202">G</option>
  </optgroup>
</select>


我希望有人能帮帮忙。我认为也许我可以进行限制,但是我不知道如何进行开始和结束分组。

最佳答案

为简化起见,让我们假设您的主题是在以下List中定义的:

List<Tuple<string, string>> topics = new List<Tuple<string, string>>
{
    Tuple.Create("010000", string.Empty),
    Tuple.Create("010100", "A"),
    Tuple.Create("010101", "B"),
    Tuple.Create("010102", "C"),
    Tuple.Create("010103", "D"),
    Tuple.Create("010200", "E"),
    Tuple.Create("010201", "F"),
    Tuple.Create("010202", "G"),
};


然后,您可以简单地遍历每个主题并逐步构建HTML:

XElement select = new XElement("select");
XElement optGroup = null;

foreach (var topic in topics)
{
    // skip root topic
    if (!topic.Item1.EndsWith("0000"))
    {
        // optgroup
        if (topic.Item1.EndsWith("00"))
        {
            optGroup = new XElement("optgroup", new XAttribute("label", topic.Item2));
            select.Add(optGroup);
        }
        // option
        else if (optGroup != null)
        {
            optGroup.Add(new XElement("option", new XAttribute("value", topic.Item1), new XText(topic.Item2)));
        }
    }
}

Console.WriteLine(select);


您将获得以下控制台输出:

<select>
    <optgroup label="A">
        <option value="010101">B</option>
        <option value="010102">C</option>
        <option value="010103">D</option>
    </optgroup>
    <optgroup label="E">
        <option value="010201">F</option>
        <option value="010202">G</option>
    </optgroup>
</select>

关于c# - 如何在linq中使用文本在分组的开头和结尾进行分组?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11601039/

10-17 00:07