2013-02-01 43 views
8

我有一个对象:群组使用Linq属性的对象列表?

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

     } 

,我使用创建一个列表: VAR网站=新名单();

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

但是我想要做的是在序列化之前按类型对网站进行分组。这可能使用LINQ或其他方法。

+1

排序依据,也许 –

+1

我会通过查看所有的LINQ方法的列表,看是否启动它们中的任何一个看起来都可能与分组功能有关。如果你这样做了,'GroupBy'应该很适合你。 -1清楚地没有研究工作。 – Servy

回答

11

这听起来像你想要的东西,如:

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

然后,只需序列化grouped。然而,我不知道在JSON中看起来像什么样的IGrouping ......并且类型将在每种情况下出现。您可以希望类似:

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

认为这会给你一个更好的JSON结构。

2

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

将产生

[ 
    [{"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"}] 
] 

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

将产生

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

这里是一个简单的控制台应用程序,你想要做什么:

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

输出:

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 
相关问题