分组依据 - LINQ 对象分组



我让人们对象,人们有属性组,使他们属于不同的组。我想获取列表并将其放在一个对象 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 调用需要两个参数:

  1. p => p.Group - 用于返回分组键的 lambda(匿名方法)

  2. (g, p) => new GroupedPeople() { Group = g, People = p.ToList() }

    该lambda

    用于基于组参数创建GroupedPeople对象,第一个参数是由第一个lambda选择的分组键,第二个参数是具有与当前组相关的项目的枚举。

相关内容

  • 没有找到相关文章