2013-02-01 19 views
8

mam obiektu:Lista grup obiektów opartych na właściwości przy użyciu Linq?

public class SiteInfo 
     { 
      public string Title { get; set; } 
      public string URL { get; set; } 
      public string Type { get; set; }  

     } 

że używam do tworzenia listy: witryn var = new List();

 foreach (SPWeb site in web.GetSubwebsForCurrentUser()) 
     { 
      string sitetype = getConfigurationKey(site, "siteType"); 
      //If sites have a site type then add to list 
      if (sitetype != "*ERROR*" && sitetype != "*KEYNOTFOUND*") 
      { 
       SiteInfo s = new SiteInfo(); 
       s.Title = site.Title; 
       s.URL = site.Url; 
       s.Type = sitetype; 

       sites.Add(s); 
      } 
     } 
     //sort list by type 
     sites.Sort((x, y) => string.Compare(x.Type, y.Type)); 

     // serialize and send..  
     JavaScriptSerializer serializer = new JavaScriptSerializer(); 
     StringBuilder sbJsonResults = new StringBuilder(); 
     serializer.Serialize(sites, sbJsonResults); 
etc..... 

Jednak chciałbym dokonać grupowania stron według typu przed serializacją. Czy jest to możliwe przy użyciu LINQ lub innej metody.

+1

OrderBy, może –

+1

Chciałbym zacząć patrząc na listę wszystkich metod LINQ i sprawdzając, czy każdy z nich wygląda na powiązany z funkcją grupowania. Jeśli to zrobisz, "GroupBy" powinien, mam nadzieję, wyróżnić się. -1 za wyraźne niewprowadzanie badań. – Servy

Odpowiedz

11

Brzmi to jak chcesz coś takiego:

// No need to sort sites first 
var grouped = sites.OrderBy(x => x.Type) 
        .GroupBy(x => x.Type); 

Wtedy właśnie serializacji grouped. Jednak nie wiem, jak będzie wyglądać IGrouping w JSON ... i typ będzie obecny w każdym przypadku. Ci może chcesz coś takiego:

var grouped = sites.OrderBy(x => x.Type) 
        .GroupBy(x => x.Type) 
        .Select(g => new { Type = g.Key, 
             Sites = g.Select(site => new { 
                  site.Title, 
                  site.URL 
                 } }); 

myślę które daje ładniejszy struktury JSON.

2

to

var sites = new List<SiteInfo>() 
{ 
    new SiteInfo(){Title="1",Type="a",URL="http://aaaa"}, 
    new SiteInfo(){Title="2",Type="b",URL="http://bbbb"}, 
    new SiteInfo(){Title="3",Type="a",URL="http://aaaa"}, 
    new SiteInfo(){Title="4",Type="b",URL="http://bbb"}, 
}; 

var json = new JavaScriptSerializer().Serialize(sites.GroupBy(s => s.Type)); 

przyniosłoby

[ 
    [{"Title":"1","URL":"http://aaaa","Type":"a"},{"Title":"3","URL":"http://aaaa","Type":"a"}], 
    [{"Title":"2","URL":"http://bbbb","Type":"b"},{"Title":"4","URL":"http://bbb","Type":"b"}] 
] 

lub

var json = new JavaScriptSerializer().Serialize(sites.GroupBy(s => s.Type) 
                 .ToDictionary(x=>x.Key,x=>x)); 

przyniosłoby

{ 
    "a":[{"Title":"1","URL":"http://aaaa","Type":"a"},{"Title":"3","URL":"http://aaaa","Type":"a"}], 
    "b":[{"Title":"2","URL":"http://bbbb","Type":"b"},{"Title":"4","URL":"http://bbb","Type":"b"}] 
} 
1

Oto aplikacji konsoli proste, że robi to, co chcesz:

static void Main(string[] args) 
{ 
    List<SiteInfo> sites = new List<SiteInfo>() 
    { 
     new SiteInfo() { Title = "Site A", Type = "Whatever 2" }, 
     new SiteInfo() { Title = "Site B", Type = "Whatever 1" }, 
     new SiteInfo() { Title = "Site C", Type = "Whatever 1" }, 
     new SiteInfo() { Title = "Site D", Type = "Whatever 3" }, 
     new SiteInfo() { Title = "Site E", Type = "Whatever 3" } 
    }; 

    var sitesGroupedByType = 
     sites.GroupBy(s => s.Type).Select(g => new { Type = g.Key, 
            Sites = g.Select(site => new 
            { 
              site.Title, 
              site.URL 
            })}); 

    foreach (var siteTypeGroup in sitesGroupedByType.OrderBy(g => g.Type)) 
    { 
     foreach(var site in siteTypeGroup.Sites) 
     { 
      Console.WriteLine(string.Format("Type => {0}, Title => {1}", 
           siteTypeGroup.Type, site.Title)); 
     } 
    } 

    Console.ReadKey(); 
} 

wyjściowa:

Type => Whatever 1, Title => Site B 
Type => Whatever 1, Title => Site C 
Type => Whatever 2, Title => Site A 
Type => Whatever 3, Title => Site D 
Type => Whatever 3, Title => Site E 
Powiązane problemy