2015-02-26 14 views
5

Tutaj mam listy od mojej klasie AssinantesJak mogę wygenerować ciąg HTML z grupy przez

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

I potrzebne do grupy przez City, ClientCod i Num, co już robiłem tutaj:

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

Następnie musiałem wygenerować ciąg HTML z LINQ, jak na poniższym przykładzie:

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

Może ktoś g Czy mam jakąkolwiek sugestię?

+3

Czemu budowania ciąg HTML przy użyciu C#? Po prostu pytam, ponieważ w zależności od twojego problemu może być lepsze rozwiązanie – konkked

+0

Ponieważ wyślę email z tym html do klienta –

Odpowiedz

1

można wygenerować pożądany HTML za pomocą XElement. Przypuszczam moja próbka może być ponownie napisane metoda LINQ zbiorczej, ale wolę zagnieżdżonych foreach ze względu na czytelność kodu

fiddle with demo

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(); 
2

Można użyć LINQ do xml do tej kwestii, również zawarty w opcjach przykład, aby dodać atrybuty, które mogłyby być przydatne w przyszłości (stylizacji lub wysyłania żądania)

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

Aby uzyskać rzeczywisty ciąg tylko używać html.ToString()

zobaczyć Fiddle here

+1

użycie XElement jest doskonałe, ale wynik różni się od html, podany w pytaniu – ASh

+0

@ASh jak działa dane wyjściowe różnią się? czy istnieje obejście? nie dało się przetestować wyjścia, więc dodatkowe informacje byłyby przydatne na początku, – konkked

+0

na początek, thml to 'IEnumerable ()'; 'string.Join (Environment.NewLine, html)' jest równe

BAURU

  • 112
    • 1412345675

BAURU

  • 45
    • 214464347
ASh

Powiązane problemy