如何计算按嵌入列表分组的列表项

时间:2016-10-27 21:14:49

标签: c# linq

我有一个像

这样的课程
class MyClass
{
    public DateTime Date { get; set; }
    public List<int> IdList { get; set; }

    public MyClass(DateTime initDate)
    {
        Date = initDate;
        IdList = new List<int>();
    }
}

并且需要计算List<MyClass>中的条目数,按int中的每个IdList分组。

我已尝试过各种Linq构造,但我无法获得任何工作。以下是我到目前为止的情况:

List<MyClass> myc = new List<MyClass>();
myc.Add(new MyClass(new DateTime(2016, 1, 1)) { IdList = new List<int> { 1, 2 } });
myc.Add(new MyClass(new DateTime(2016, 1, 2)) { IdList = new List<int> { 1, 3 } });
myc.Add(new MyClass(new DateTime(2016, 1, 3)) { IdList = new List<int> { 1, 4 } });
myc.Add(new MyClass(new DateTime(2016, 1, 4)) { IdList = new List<int> { 5, 6 } });
myc.Add(new MyClass(new DateTime(2016, 1, 5)) { IdList = new List<int> { 2, 3 } });

var grouped = from p in myc
    group p by p.IdList into g
    select new { Id = g.Key, Count = g.Count() };
foreach (var x in grouped)
{
    Console.WriteLine("ID: {0}, Count: {1}", x.Id, x.Count);
}

// Expecting output like:
// ID: 1, Count: 3
// ID: 2, Count : 2
// etc.

如果int Id中有一个MyClass属性,那就很简单,但我无法弄清楚如何使用List<int>。有没有替代编写嵌套循环和填充字典?谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

您可以使用SelectMany

var grouped = myc.SelectMany(x => x.IdList).GroupBy(x => x);
foreach (var i in g)
{
    Console.WriteLine(string.Format("Id: {0}, Count: {1}", i.Key,i.Count()));
}

这应该可以为您提供所需的输出。

答案 1 :(得分:1)

我不知道我是否正确理解你的要求。但试试这个让我知道:

var groupedIds = myc.SelectMany(x => x.IdList.Select(i => i))
    .GroupBy(x => x)
    .ToList();

完整的小提琴here

以及here SelectMany文档,以便您了解此代码的含义。

希望这有帮助!