复杂的LINQ查询

7
考虑这个集合。
List<Person> people = new List<Person>
        {
            new Person{Name = "A", SSN="1", Age = 23},
            new Person{Name = "A", SSN="2", Age = 23},
            new Person{Name = "B", SSN="3", Age = 24},
            new Person{Name = "C", SSN="4", Age = 24},
            new Person{Name = "D", SSN="5", Age = 23}
        };

问题是:我该如何编写一个LINQ查询,按年龄对Person进行分组,然后计算每个组中具有相同名称的人数?

我尝试使用group by操作符、嵌套查询等所有可能性,但仍无法找出确切的查询。

祝好, Jeez

4个回答

9

你能行吗?

var ages  = from p in people 
            group p by p.Age into g
            select new { 
                Age = g.Key, 
                Count = g.Count(), 
                Names = from prs in g 
                        group prs by prs.Name
            };

Names属性将作为键名,您可以通过每个名称的Count()方法来获取数量。


完美,这正是我在寻找的 :) - Jeevan

2
基本上和以下内容一样:
var peeps = 
    people.GroupBy(p => p.Age).Select(gp => new
          {
              Aged = gp.Key,
              Count = gp.Count(),
              NameGrp = gp.GroupBy(pers => pers.Name)
          });

吉姆


0

这与按年龄和姓名分组,包括计数并可选择按年龄和姓名排序没有什么不同。对于成对的LINQ操作,通常可以通过使用匿名类型来完成,如下所示:

var people = new List<Person> { 
    new Person { FirstName = "John", LastName = "Leidegren", Age = 25 },
    new Person { FirstName = "John", LastName = "Doe", Age = 25 },
    new Person { FirstName = "Not john", LastName = "Doe", Age = 26 },
};

foreach (var g in (from p in people
                   group p by new { p.Age, p.FirstName }))
{
    Console.WriteLine("Count: {0}", g.Count());

    foreach (var person in g.OrderBy(x => x.FirstName))
    {
        Console.WriteLine("FirstName: {0}, LastName: {1}, Age: {2}"
            , person.FirstName
            , person.LastName
            , person.Age);
    }
}

这里很清楚唯一键是什么,而且可以更改它而无需改变剩余程序的结构。

0
List<Person> persons = new List<Person>
{
   new Person{Name = "A", SSN="1", Age = 23},
   new Person{Name = "A", SSN="2", Age = 23},
   new Person{Name = "B", SSN="3", Age = 24},
   new Person{Name = "C", SSN="4", Age = 24},
   new Person{Name = "D", SSN="5", Age = 23}
};
var out1 = persons.GroupBy(p => new { p.Age, p.Name }).Select(s => new { Name = s.Key.Name,age = s.Key.Age, cnt = s.Count() }); ;
System.Threading.Tasks.Parallel.ForEach(out1, item => Console.WriteLine(item.Name + " " + item.age + " " + item.cnt));  

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接