linq对象分组
我有人的对象和人的财产集团,使他们属于不同的群体。 我想获取列表并将其放入一个对象GrouppedPeople中,其中将有List coll。一个coll元素只包含属于同一组的人 如果我有3个人:linq对象分组,linq,group-by,linq-to-objects,Linq,Group By,Linq To Objects,我有人的对象和人的财产集团,使他们属于不同的群体。 我想获取列表并将其放入一个对象GrouppedPeople中,其中将有List coll。一个coll元素只包含属于同一组的人 如果我有3个人: List<People>(){new People{Name="Test", Group = "Group1"}, new People{Name="SameGroup", Group = "Group1"}, new Peopl
List<People>(){new People{Name="Test", Group = "Group1"},
new People{Name="SameGroup", Group = "Group1"},
new People{Name="Other", Group = "OtherGroup"}}
它工作正常,但结果对象不是强类型的。我想要一份清单作为结果。有没有办法从匿名对象类型中获取它?有没有其他方法可以通过linq获得这一切并保持强输入?您将得到一个
IEnumerable
。该接口具有一个包含您分组依据的值的字符串(在您的情况下,该字符串包含人员
对象中组
属性中的值),您可以通过该字符串进行枚举以获取属于该组的项:
IEnumerable<IGrouping<string, People>> result = from oneGroup in mates
group oneGroup by oneGroup.Group into g
select g;
foreach (IGrouping<string, People> grouping in result)
{
Console.WriteLine("Group: {0}", grouping.Key);
foreach (People people in grouping)
{
Console.WriteLine(" - {0}", people.Name);
}
}
这将返回匿名类型对象的列表:
var result = (from oneGroup in mates
group oneGroup by oneGroup.pGroupName into g
select g).ToList();
但如果要返回特定类型的对象,则应创建具有所需属性的新类:
public class MateGroup
{
public string Name {get;set;}
}
var result = (from oneGroup in mates
group oneGroup by oneGroup.pGroupName into g
select new MateGroup(){ Name = g.<field_name>}).ToList();
我更喜欢用普通的C#语法来编写LINQ查询,它比简单的查询表单更清晰
可以使用结果选择器将分组结果解析为类型化对象
var resultList = mates
.GroupBy(p => p.Group, (g, p) => new B() { Group = g, People = p.ToList() })
.ToList();
完整的测试控制台应用程序代码:
class People
{
public string Name;
public string Group;
}
class GroupedPeople
{
public string Group;
public List<People> People;
}
class Program
{
static void Main(string[] args)
{
var mates = new List<People>()
{
new People{Name="Test", Group = "Group1"},
new People{Name="SameGroup", Group = "Group1"},
new People{Name="Other", Group = "OtherGroup"}
};
var resultList = mates
.GroupBy(p => p.Group, (g, p) => new GroupedPeople() { Group = g, People = p.ToList() })
.ToList();
}
}
班级人员
{
公共字符串名称;
公共字符串组;
}
阶级群体
{
公共字符串组;
公众人物名单;
}
班级计划
{
静态void Main(字符串[]参数)
{
var=新列表()
{
新人{Name=“Test”,Group=“Group1”},
新人{Name=“SameGroup”,Group=“Group1”},
新人{Name=“Other”,Group=“OtherGroup”}
};
var resultList=mates
.GroupBy(p=>p.Group,(g,p)=>newgroupedpeople(){Group=g,People=p.ToList()})
.ToList();
}
}
GroupBy调用需要两个参数:
p=>p.Group
-用于返回分组键的lambda(匿名方法)(g,p)=>新
GroupedPeople(){Group=g,People
=p.ToList()}
lambda用于基于组参数创建GroupedPeople对象,第一个参数是由第一个lambda选择的分组键,第二个参数是与当前组相关的项的枚举你不会失去强大的打字能力。匿名类型与名义类型一样是强类型。他们只是没有名字,仅此而已。你想要什么类型的列表?据我所知,您的现有代码中必须有IEnumerable。我想要列表。GrouppedPeople是包含列表的对象。我想要列表。GrouppedPeople是一个包含列表的对象。我怎么能得到它?维亚切斯拉夫,你能,请,解释得更详细些吗?我试图使用这个代码,但它对我不起作用。什么是“g”?我在VS中遇到以下错误:无法将lambda表达式转换为IEqualityComparer类型,因为它不是委托类型。需要详细信息吗?我不知道你需要关于lambda或扩展的信息吗?非常好用,谢谢。我希望我能把2个答案标记为答案。
var result = (from oneGroup in mates
group oneGroup by oneGroup.pGroupName into g
select new GrouppedPeople(){ People = g.ToList()}).ToList();
var resultList = mates
.GroupBy(p => p.Group, (g, p) => new B() { Group = g, People = p.ToList() })
.ToList();
class People
{
public string Name;
public string Group;
}
class GroupedPeople
{
public string Group;
public List<People> People;
}
class Program
{
static void Main(string[] args)
{
var mates = new List<People>()
{
new People{Name="Test", Group = "Group1"},
new People{Name="SameGroup", Group = "Group1"},
new People{Name="Other", Group = "OtherGroup"}
};
var resultList = mates
.GroupBy(p => p.Group, (g, p) => new GroupedPeople() { Group = g, People = p.ToList() })
.ToList();
}
}