在C#中你可以在范围选择中执行范围选择吗?

时间:2015-11-11 21:42:42

标签: c# linq datetime visual-studio-2012

我最终希望在列表中获取当前年份的每个日期。

我有以下内容,它给了我一个月的所有日期..

    using System;
    using System.Collections.Generic;
    using System.Linq;
    internal class Program
    {
        public static void Main(String[] args)
        {
            List<DateTime> ldtDates = new List<DateTime>();
            Random rnd = new Random();
            int intCurrentYear = DateTime.Now.Year;
            int intCurrentMonth = DateTime.Now.Month;

            List<DateTime> DatesThisMonth =
                Enumerable.Range(1, DateTime.DaysInMonth(intCurrentYear, intCurrentMonth))
                          .Select(i => new DateTime(intCurrentYear, intCurrentMonth, i))
                          .ToList();

            foreach (var q in DatesThisMonth)
            {
                Console.WriteLine(q);
            }
            Console.WriteLine("Press <enter> to continue");
            Console.ReadLine();
        }
    }

这适用于本月,但我想围绕此代码包装一个范围(1,12),如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
internal class Program
{
    public static void Main(String[] args)
    {
        List<DateTime> ldtDates = new List<DateTime>();
        Random rnd = new Random();
        int intCurrentYear = DateTime.Now.Year;
        int intCurrentMonth = DateTime.Now.Month;

        var DatesThisYesr =
            Enumerable.Range(1, 12).Select(y=>
            Enumerable.Range(1, DateTime.DaysInMonth(intCurrentYear, y))
                      .Select(i => new DateTime(intCurrentYear, intCurrentMonth, i))
                      ).ToList();

        foreach (var q in DatesThisYesr)
        {
            Console.WriteLine(q);
        }
        Console.WriteLine("Press <enter> to continue");
        Console.ReadLine();
    }
}

以下是我的输出结果:

ime]
System.Linq.Enumerable+WhereSelectEnumerableIterator`2[System.Int32,System.DateT
ime]
System.Linq.Enumerable+WhereSelectEnumerableIterator`2[System.Int32,System.DateT
ime]
System.Linq.Enumerable+WhereSelectEnumerableIterator`2[System.Int32,System.DateT
ime]
System.Linq.Enumerable+WhereSelectEnumerableIterator`2[System.Int32,System.DateT
ime]
System.Linq.Enumerable+WhereSelectEnumerableIterator`2[System.Int32,System.DateT
ime]
System.Linq.Enumerable+WhereSelectEnumerableIterator`2[System.Int32,System.DateT
ime]
System.Linq.Enumerable+WhereSelectEnumerableIterator`2[System.Int32,System.DateT
ime]
System.Linq.Enumerable+WhereSelectEnumerableIterator`2[System.Int32,System.DateT
ime]
System.Linq.Enumerable+WhereSelectEnumerableIterator`2[System.Int32,System.DateT
ime]
System.Linq.Enumerable+WhereSelectEnumerableIterator`2[System.Int32,System.DateT
ime]
System.Linq.Enumerable+WhereSelectEnumerableIterator`2[System.Int32,System.DateT
ime]
Press <enter> to continue

我可以使用For循环,但是应该可以通过Linq执行此操作。

谢谢,

2 个答案:

答案 0 :(得分:5)

像这样使用SelectMany

var DatesThisYesr =
    Enumerable.Range(1, 12)
    .SelectMany(month =>
        Enumerable.Range(1, DateTime.DaysInMonth(intCurrentYear, month))
        .Select(day => new DateTime(intCurrentYear, month, day)))
    .ToList();

答案 1 :(得分:3)

您目前正在选择一系列序列 - 这就是为什么当您打印每个元素时,它会显示它是WhereSelectEnumeratableIterator。我怀疑你实际想要扁平化,所以你应该使用SelectMany而不是Select。请注意,您想要使用intCurrentMonth - 您想要使用y(这是一个有效代表的变量的奇怪名称月号码。

将它写为查询表达式可能更简单:

var dates = from month in Enumerable.Range(1, 12)
            from day in Enumerable.Range(1, DateTime.DaysInMonth(year, month))
            select new DateTime(year, month, day);

我没有看到任何理由在此处致电ToList(),因为您只是在迭代结果。请注意使用有意义的范围变量名称如何使整个 更具可读性。