首页 文章

使用Linq的C#ArrayList组

提问于
浏览
-1

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

Say for example this is the scenario input.

输入:Mo-Fr 06:00-22:00,Sa 07:00-22:00,08:00-22:00

Formetet到数据库表:

Table name : (Opening)

  • Day | DayNumber | Number | Open | Close

  • 星期一,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

I would like to group by day range from this table

预期的输出将如下:

"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"
          }
        }
      ]

2 回答

  • 0

    试试这个:

    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 );
    
    
            }
    
        }
    
    }
    
  • 1

    要做到这一点,我正在使用这样的东西 . 但我认为它无法满足我的确切输出:

    如果有一个组具有相同的开放收盘日范围,则此代码将位于同一组中且不会有所不同 .

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

相关问题