Ash*_*ine 5 linq ienumerable group-by
我很难创建针对通用List myList的工作Group By和Sort By子句.myList有一个属性'Settings'列表,它本身包含每个业务的'子'属性列表.
我希望按行业和每个行业进行分组,按业务名称排序.我的意图是:
string groupSetting = "Industry";
sortSetting = "BusinessName";
myList.GroupBy(p => p.Settings.Find(s => s.Name == groupSetting)).OrderBy(p => p.Settings.Find(t => t.Name == sortSetting));
Run Code Online (Sandbox Code Playgroud)
但是我收到错误:' System.Linq.IGrouping不包含Settings的定义,也没有扩展方法设置接受System.Linq.Igrouping类型的第一个参数可以找到.... '表示我无法调用该命令没有一些改造或额外处理的条款.
我已经尝试了各种各样的事情来解决这个问题并让它发挥作用,但我错过了一些东西.任何帮助赞赏
Ori*_*rds 13
您的问题是GroupBy不返回单个设置列表,它返回"列表列表".这是IGrouping你所看到的.
您需要遍历每个组,对该组进行IGrouping排序,然后迭代组中的每个项目.注意:
public static void Main( string[] args )
{
var groupSetting = "Industry";
// step 1: group the data. Note this doesn't actually create copies of the data as
// it's all lazy loaded
// BEWARE. If a company doesn't have the "Industry" setting, this will throw an exception
var grouped = companies.GroupBy(c => c.Settings.First(s => s.Name == groupSetting).Value);
foreach( var group in grouped )
{
Console.WriteLine(group.Key);// this is the Value that came out of the GroupBy
// Note how we have to do the ordering within each individual group.
// It doesn't make sense to try group them in one hit like in your question
foreach( var item in group.OrderBy(bus => bus.Name) )
Console.WriteLine(" - " + item.Name);
}
}
Run Code Online (Sandbox Code Playgroud)
为清晰起见提供数据结构:
struct Setting { public string Name; public string Value; }
struct Business { public string Name; public IEnumerable<Setting> Settings; }
static IEnumerable<Business> companies = new[]{
new Business{ Name = "XYZ Inc.", Settings = new[]{
new Setting{ Name="Age", Value="27"},
new Setting{ Name="Industry", Value="IT"}
}},
new Business{ Name = "Programmers++", Settings = new[]{
new Setting{ Name="Age", Value="27"},
new Setting{ Name="Industry", Value="IT"}
}},
new Business{ Name = "Jeff's Luxury Salmon", Settings = new[]{
new Setting{ Name="Age", Value="63"},
new Setting{ Name="Industry", Value="Sports"}
}},
new Business{ Name = "Bank of Khazakstan", Settings = new[]{
new Setting{ Name="Age", Value="30"},
new Setting{ Name="Industry", Value="Finance"}
}},
};
Run Code Online (Sandbox Code Playgroud)
这会产生以下输出:复制/粘贴代码并运行它并使用它
IT
- Programmers++
- XYZ Inc.
Sports
- Jeff's Luxury Salmon
Finance
- Bank of Khazakstan
Run Code Online (Sandbox Code Playgroud)