计算日期的实例

时间:2013-02-22 13:25:54

标签: c# asp.net-mvc

我确信这方面有一个简单的答案,但我似乎无法用短语来表达搜索结果。

在我的控制器中,假设我有一个类x的实例列表,它又有一个类y的成员变量,它包含一个日期变量。我想要做的是计算每个日期的实例数,以构建图表。所以我想要的就是每个不同日期有一行的数组,以及该日期发生次数的计数。

任何有关最佳方法的建议都将受到赞赏。

4 个答案:

答案 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; }
        }
    }
}