【问题标题】:C# ArrayList group using Linq使用 Linq 的 C# ArrayList 组
【发布时间】:2015-05-09 11:13:49
【问题描述】:

我目前被困在这个地方。我需要一些帮助。

比如说这是场景输入。

输入:周一至周五 06:00-22:00,周六 07:00-22:00,所以 08:00-22:00

Formetet 到数据库表:

表名:(开始)

  • 天 |天数 |号码 |打开 |关闭

  • 周一,1,0:00,22:00

  • 星期二 2 0:00 22:00
  • 周三,3,0:00,22:00
  • 周四、4、0:00、22:00
  • 周五、5、0:00、22:00
  • 周六、6、7:00、24:00
  • 周日 0 8:00 24:00

我想从这张表中按日期范围分组

预期的输出将是:

"periods": [
        {
          "open": {
            "day": 1,
            "time": "06:00"
          },
          "close": {
            "day": 5,
            "time": "22:00"
          }
        },
        {
          "open": {
            "day": 6,
            "time": "07:00"
          },
          "close": {
            "day": 6,
            "time": "24:00"
          }
        },
        {
          "open": {
            "day": 0,
            "time": "08:00"
          },
          "close": {
            "day": 0,
            "time": "24:00"
          }
        }
      ]

【问题讨论】:

    标签: c# arrays arraylist group-by sql-order-by


    【解决方案1】:

    试试这个:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data;
    using System.Xml;
    using System.Xml.Serialization;
    
    
    namespace ConsoleApplication25
    {
        class Program
        {
    
            static void Main(string[] args)
            {
                List<string> dayNames = new List<string>(){"Mo","Tu","We","Th","Fr","Sa","So"};
                string input = "Mo-Fr 06:00-22:00, Sa 07:00-22:00, So 08:00-22:00";
                string[] days = input.Split(new char[] { ',' });
    
                var dayRange = (from d in days
                                select d.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries))
                               .Select(x => new { days = x[0].Trim(), time = x[1].Trim() })
                               .Select(x => new {  
                                   startDay = x.days.Contains("-") ? x.days.Split(new char[] {'-'})[0] : x.days,
                                   endDay = x.days.Contains("-") ? x.days.Split(new char[] {'-'})[1] : x.days,
                                   startTime = x.time.Contains("-") ? x.time.Split(new char[] {'-'})[0] : x.time,
                                   endTime = x.time.Contains("-") ? x.time.Split(new char[] {'-'})[1] : x.time,
                               }); 
    
                var period = dayRange.Select(x => new {
                    open = new {day = dayNames.IndexOf(x.startDay) + 1, time = x.startTime},
                    close = new {day = dayNames.IndexOf(x.endDay) + 1, time = x.endTime}
                });
    
                string formatedPeriods = string.Join(",",period.Select(x => 
                    "{\n\r\"open\": {\n\r" +
                    "\"day\": " + x.open.day.ToString() + "," +   
                    "\"time\": " + x.open.time.ToString() + "\n\r}," +   
                   "{\n\r\"close\": {\n" +
                    "\"day\": " + x.open.day.ToString() + "," +   
                    "\"time\": " + x.open.time.ToString() + "\n\r}\n\r}"   
                    ).ToArray());
                string output = string.Format("\"periods\": [\n\r{0}\n\r]",formatedPeriods );
    
    
            }
    
        }
    
    }
    

    【讨论】:

    • 非常感谢您的 cmets。它是一个很好的解决方案。但我需要这样的东西。我已经解析了它并将其存储到数据库中,这是我目前存储的格式` Day |天数 |号码 |打开 |周一、1、0:00、22:00 周二、2、0:00、22:00 周三、3、0:00、22:00 周四、4、0:00、22:00 周五、5、0 :00, 22:00 Sat, 6, 7:00, 24:00 Sun, 0, 8:00, 24:00 ` 我需要从中获取组数据。
    • 我编辑我的问题。我实际上需要从该表中获取已形成的数据。
    • @jdweng 我已经编辑了 sn-p,因为代码 sn-ps 只能与 HTML-CSS-JS 三元组一起使用。对于其他语言,它们只会添加噪音而没有任何好处。
    【解决方案2】:

    为此,我正在使用类似的东西。但我认为它不会满足我的确切输出:

    如果有一组具有相同的开盘收盘日范围,则此代码将在同一组中并且没有区别。

                var keyMap = weekDayMap.GroupBy(c => new {c.OpenFrom, c.OpenTo});
                var openingDay = new OpeningHourMapper();
                var period = new List<Period>();
                foreach (var put in keyMap )
                {
                    openingDay = weekDayMap.FirstOrDefault(c => c.OpenFrom == put.Key.OpenFrom && c.OpenTo == put.Key.OpenTo);
                    period.AddRange(GetPeriodList(openingDay, openingDay));
                }
    
    
    
    namespace Controllers.V1.Response.OpeningHourMapper
    {
        public class OpeningHourMapper
        {
            public int StationNumber { get; set; }
    
            public string Weekday { get; set; }
    
            public int WeekdayNumber { get; set; }
    
            public string OpenFrom { get; set; }
    
            public string OpenTo { get; set; }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-23
      • 2010-09-20
      • 1970-01-01
      • 1970-01-01
      • 2014-11-13
      • 2011-08-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多