如何从group by生成一个html字符串

5

这里有一个来自我的班级 Assinantes 的名单

new Assinante
            {
                City= "BAURU",
                Num= 112,
                ClientCode= 3123,
                Phone= "1412345675"
            },
            new Assinante
            {
                City= "BAURU",
                Num= 45,
                ClientCode= 3123,
                Phone= "214464347"
            }

我需要按照城市、客户代码和编号进行分组,已经在这里完成了:

var listGroup= (from a in lista
            group a by new {a.City, a.ClientCode, a.Num});

然后,我需要使用Linq生成一个HTML字符串,就像下面的示例:

<div>
   <h2>Bauru</h2>
   <ul>
        <li>3123</li>
        <ul>
            <li>112</li>
            <ul>
                <li>1412345675</li>
            </ul>
            <li>45</li>
            <ul>
                <li>214464347</li>
            </ul>
        </ul>
    </ul>
</div>

有人能给我一些建议吗?

这段内容与IT技术无关。

3
为什么要用C#构建HTML字符串?只是问一下,因为根据你的问题,可能有更好的解决方案。 - konkked
因为我将向客户发送带有此HTML的电子邮件。 - Mauro Maciel
2个回答

2
您可以使用linq to xml来解决这个问题,示例选项还包括添加属性的方法,这在未来可能非常有用(样式或查询)。
var html =  new XElement("div", new XAttribute("class","dynamic-content"), 
                    from i in lst.GroupBy(x=>new{x.City,x.ClientCode,x.Num}) select 
                        new XElement("div",new XAttribute("class","city"),
                            new XElement("h1",new XAttribute("class","city-name"), i.Key.City ),
                            new XElement("ul",
                                from k in i.GroupBy(a=>a.ClientCode) select
                                        new XElement("li", 
                                            new XElement("h4",new XAttribute("class","client-code"), k.Key),
                                            new XElement("ul",
                                                from j in k.GroupBy(a=>a.Num) select 
                                                    new XElement("li", 
                                                        new XAttribute("class","client-num"), j.Key ,
                                                        new XElement("ul", new XAttribute("class","phone-numbers"), 
                                                            from l in j select 
                                                                new XElement("li", new XAttribute("class","phone-number"), l.Phone)
                                                    )
                                                )
                                            )
                                        )
                            )
                        )
            );

要获取实际字符串,只需使用 html.ToString()
在这里查看示例:链接

1
使用XElement非常好,但结果与问题中给出的HTML不同。 - ASh
@ASh 输出有什么不同?是否有解决方法?我没有测试输出的机会,因此额外的见解将非常有用。 - konkked
首先,thml是IEnumerable<XElement>()string.Join(Environment.NewLine,html)等于<div> <h1>BAURU</h1> <ul> <li>112<ul><li>1412345675</li></ul></li> </ul></div> <div> <h1>BAURU</h1> <ul> <li>45<ul><li>214464347</li></ul></li> </ul> </div> - ASh
1
@konkked 感谢您的帮助,但是在您的回答中缺少了ClientCode。我不知道如何使用那个XElement,提前致谢。抱歉我的英语不好。 - Mauro Maciel
@MauroMaciel 感谢您的提醒,我进行了一些更改,将类包含到HTML中。 - konkked

1
你可以使用XElement生成所需的HTML。我认为我的示例可以使用Linq方法Aggregate进行重写,但由于代码更易读,我更喜欢嵌套foreach。

点此查看演示

using System.Xml;
using System.Xml.Linq;
...
        var xml = new XElement("div");

        foreach(var city in lst.GroupBy(x=>x.City))
        {
            var cityXml = new XElement("h2", city.Key);
            var cityUl = new XElement("ul");                
            foreach(var client in city.GroupBy(c=>c.ClientCode))
            {
                var clientXml = new XElement("li", client.Key);
                var clientUl = new XElement("ul");

                foreach(var num in client.GroupBy(cl=>cl.Num))
                {
                    var numXml = new XElement("li", num.Key);
                    var numUl = new XElement("ul");                     
                    foreach(var phone in num)
                    {
                        numUl.Add(new XElement("li",phone.Phone));
                    }
                    clientUl.Add(numXml);
                    clientUl.Add(numUl);
                }                   
                cityUl.Add(clientXml);
                cityUl.Add(clientUl);
            }
            xml.Add(cityXml);
            xml.Add(cityUl);
        }

        string res = xml.ToString();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接