使用linq

时间:2018-03-22 01:50:09

标签: c# linq functional-programming

假设我在2018年有一个包含5个日期[Mar 2,Mar 6, Mar 7, Mar 26]的列表。 本周开始于周六和周日结束。 我想要以下结果

[Mar 2]
[Mar 6, Mar 7]
[Mar 26]

如何使用LINQ进行操作?或者以功能的方式。

2 个答案:

答案 0 :(得分:2)

您可以在DateTime

上使用以下内容

Calendar.GetWeekOfYear Method (DateTime, CalendarWeekRule, DayOfWeek)

  

返回包含指定日期的一年中的一周   日期时间值。

     
      
  • 时间

         
        
    • 输入:System.DateTime
    •   
    • 日期和时间值。
    •   
  •   
  • 规则

         
        
    • 输入:System.Globalization.CalendarWeekRule
    •   
    • 定义日历周的枚举值。
    •   
  •   
  • Firstdayofweek可

         
        
    • 输入:System.DayOfWeek
    •   
    • 表示一周中第一天的枚举值。
    •   
  •   

鉴于

List<DateTime> myAwesomeList;

<强>用法

var result = myAwesomeList.GroupBy(x => 
                    CultureInfo.CurrentCulture.Calendar
                               .GetWeekOfYear(x.date, 
                                              CalendarWeekRule.FirstDay, 
                                              DayOfWeek.Saturday))
                          .Select(grp => grp.ToList())
                          .ToList();

<强>返回

List<List<DateTime>>

答案 1 :(得分:0)

我想将此作为一个迭代答案发布,因为我不想在问题中引入迭代偏见思维,因为这可能会影响我得到的答案的优雅:)所以如果你理解,请不要读这个问的问题。

这是一种使用迭代方法解决问题的快速而肮脏的方法。

var orders = new List<int> { 4, 5, 6, 0, 1, 2, 3 };
var nums = new List<int> {2, 5, 6, 2, 2, 4};


            var queue = new Queue<int>(nums);
            var results = new List<List<int>>();
            while (queue.Count > 0)
            {
                var subLists = new List<int>();
                foreach (var order in orders)
                {
                    if(order == queue.Peek())
                        subLists.Add(queue.Dequeue());


                    if (queue.Count == 0)
                        break;
                }

                results.Add(subLists);
            }