我确信这方面有一个简单的答案,但我似乎无法用短语来表达搜索结果。
在我的控制器中,假设我有一个类x的实例列表,它又有一个类y的成员变量,它包含一个日期变量。我想要做的是计算每个日期的实例数,以构建图表。所以我想要的就是每个不同日期有一行的数组,以及该日期发生次数的计数。
任何有关最佳方法的建议都将受到赞赏。
答案 0 :(得分:4)
听起来你想要这样的东西。
var countByDate = items.GroupBy(x => x.Invoice.ReceivedDate) // Or whatever
.Select(g => new { Date = g.Key, Count = g.Count() })
.OrderBy(pair => pair.Date);
.ToArray();
LINQ摇滚:)
答案 1 :(得分:3)
您可以使用Linq的Enumerable.GroupBy
:
var dayGroups = listX.GroupBy(x => x.Y.DateTimeVar.Date)
.Select(g => new { Day = g.Key, Count = g.Count() })
.ToArray();
现在你拥有所需的一切,即日期和出现时间:
foreach(var dayGroup in dayGroups)
{
Console.WriteLine("Day: {0} Count: {1}", dayGroup.Day.ToString(), dayGroup.Count);
}
假设DateTimeVar
是属性,并且您希望按天分组。
答案 2 :(得分:0)
使用扩展方法应该有帮助。如果不知道你拥有的类型,这是我能做的最好的事情:
ListOfx.Select(x => x.ClassY.Date)
上一行将为您提供所有日期。然后,您可以使用GroupBy按值对它们进行分组。这应该会给你一个列表清单。
ListOfx.Select(x => x.ClassY.Date).GroupBy(x => x.Date)
我认为这应该有效。我目前无法尝试代码。
答案 3 :(得分:0)
代码可能很笨重,但这对您有用:
using System;
using System.Collections.Generic;
using System.Linq;
namespace App
{
class Program
{
static void Main(string[] args)
{
List<X> xs = new List<X>
{
new X { Y = new Y {D = DateTime.Now}},
new X { Y = new Y {D = DateTime.Now}},
new X { Y = new Y {D = DateTime.Now}},
};
IEnumerable<DateTime> ds = xs.Select(x => x.Y.D).Distinct();
var q = from d in ds
select new
{
D = d,
Count = xs.Count(x => x.Y.D.Equals(d))
};
foreach (var i in q)
{
Console.WriteLine(i);
}
}
class X
{
public Y Y { get; set; }
}
class Y
{
public DateTime D { get; set; }
}
}
}