我确信对此有一个简单的答案,但我似乎无法通过搜索来获得正确的结果。
在我的控制器中,假设我有一个类 x 的实例列表,它又具有一个 y 类的成员变量,其中包含一个日期变量。我要做的是计算每个日期有多少实例,以构建图表。所以我想要的只是一个数组,每个不同的日期有 1 行,以及该日期发生的次数。
任何有关执行此操作的最佳方法的建议将不胜感激。
我确信对此有一个简单的答案,但我似乎无法通过搜索来获得正确的结果。
在我的控制器中,假设我有一个类 x 的实例列表,它又具有一个 y 类的成员变量,其中包含一个日期变量。我要做的是计算每个日期有多少实例,以构建图表。所以我想要的只是一个数组,每个不同的日期有 1 行,以及该日期发生的次数。
任何有关执行此操作的最佳方法的建议将不胜感激。
听起来你想要这样的东西。
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 摇滚 :)
您可以使用 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
是属性,并且您想按天分组。
使用扩展方法应该会有所帮助。在不知道您拥有的类型的情况下,这是我能做的最好的事情:
ListOfx.Select(x => x.ClassY.Date)
上一行将为您提供所有日期。然后您可以使用 GroupBy 按它们的值对它们进行分组。这应该给你一个列表列表。
ListOfx.Select(x => x.ClassY.Date).GroupBy(x => x.Date)
我认为这应该有效。我目前无法尝试该代码。
代码可能很笨拙,但这应该对您有用:
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; }
}
}
}