2013-02-01 15 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または他の方法を使用して可能ですか?

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

それからちょうどシリアライズgrouped

+1

[並べ替え、おそらく –

+1

私はLINQのメソッドのすべてのリストを見て、あれば見ることによって開始しますいずれもグループ化機能に関連しているように見えます。そうすれば、 'GroupBy'はうまくあなたに目立つはずです。 -1は明らかに研究努力をしていない。 – Servy

答えて

11

は、それはあなたのような何かをしたいように聞こえます。しかし、私はかなりIGrouping JSONのように見えるかわからない...と型はそれぞれの場合に存在します。あなたのよりよいJSON構造を与えるだろうと思い

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

:あなたのような何かをしたいことがあります。

2

{ 
    "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"}] 
} 
を生成するこの

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

を生成します

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 
関連する問題