linq对象分组

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

我有人的对象和人的财产集团,使他们属于不同的群体。 我想获取列表并将其放入一个对象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"}}

它工作正常,但结果对象不是强类型的。我想要一份清单作为结果。有没有办法从匿名对象类型中获取它?有没有其他方法可以通过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();
        }
    }