我让人们对象,人们有属性组,使他们属于不同的组。我想获取列表并将其放在一个对象 GrouppedPeople 中,其中会有 List coll。一个 coll 元素仅包含属于同一组的人员。
因此,如果我有 3 个人:
List<People>(){new People{Name="Test", Group = "Group1"},
new People{Name="SameGroup", Group = "Group1"},
new People{Name="Other", Group = "OtherGroup"}}
我需要有 2 个分组人员的集合。第一个将包含"测试和相同组",第二个将包含"其他"(按"组"属性分组)。我试图使用 linq 来做到这一点。
我需要结果的类型为列表。GrouppedPeople 是一个类,它只有一个 List 类型的属性,并且所有人都来自同一个组。
我得出了这样的东西:
from oneGroup in mates
group oneGroup by oneGroup.pGroupName into g
select g;
它工作正常,但结果对象不是强类型。并且我喜欢将列表作为结果。有没有办法从该匿名对象类型中获取它?还有其他方法可以使用 linq 获得所有这些并保持强类型吗?
返回匿名类型对象列表:
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();
上级:
根据您的意见,请尝试以下操作:
var result = (from oneGroup in mates
group oneGroup by oneGroup.pGroupName into g
select new GrouppedPeople(){ People = g.ToList()}).ToList();
你会得到的是一个IEnumerable<IGrouping<string, People>>
。IGrouping<TKey, TElement>
接口有一个包含分组依据的值的Key
(在本例中是包含 People
对象中 Group
属性的值的字符串),您可以枚举它以获取属于该组的项:
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);
}
}
结果输出(基于示例数据):
Group: Group1
- Test
- SameGroup
Group: OtherGroup
- Other
我更喜欢常见的 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();
}
}
GroupBy 调用需要两个参数:
p => p.Group
- 用于返回分组键的 lambda(匿名方法)(g, p) => new GroupedPeople() { Group = g, People = p.ToList() }
用于基于组参数创建GroupedPeople对象,第一个参数是由第一个lambda选择的分组键,第二个参数是具有与当前组相关的项目的枚举。