[英]Group List of Objects based on Property using Linq?
I have an object:我有一个对象:
public class SiteInfo
{
public string Title { get; set; }
public string URL { get; set; }
public string Type { get; set; }
}
That I am using to create a list: var sites = new List();我用来创建一个列表: var sites = 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.....
However what I would like to do is group the sites by Type prior to serializing them.但是,我想做的是在序列化站点之前按类型对站点进行分组。 Is this possible using LINQ or some other method.
这是否可以使用 LINQ 或其他一些方法。
It sounds like you want something like:听起来你想要这样的东西:
// No need to sort sites first
var grouped = sites.OrderBy(x => x.Type)
.GroupBy(x => x.Type);
Then just serialize grouped
.然后只需序列化
grouped
。 However, I don't know quite what an IGrouping
will look like in JSON... and the type will be present in each case.但是,我不太清楚 JSON 中的
IGrouping
会是什么样子……并且类型将出现在每种情况下。 You may want something like:你可能想要这样的东西:
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
} });
I think that would give you a nicer JSON structure.我认为这会给你一个更好的 JSON 结构。
This这
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));
would produce会产生
[
[{"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"}]
]
or要么
var json = new JavaScriptSerializer().Serialize(sites.GroupBy(s => s.Type)
.ToDictionary(x=>x.Key,x=>x));
would produce会产生
{
"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"}]
}
Here's a straightforward console application that does what you want:这是一个简单的控制台应用程序,可以执行您想要的操作:
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();
}
Output:输出:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.