【问题标题】:How to read date from text file, assign it to date and remove duplicate date in C# Linq如何从文本文件中读取日期,将其分配给日期并删除 C# Linq 中的重复日期
【发布时间】:2016-04-22 11:49:31
【问题描述】:

我该如何进行这个练习?我不知道如何使用 LINQ 读取文本文件。有谁知道我该如何处理这个问题?

input.txt

2013/05/28 06:44:28 AM
2013/04/12 02:27:00 AM
2013/04/08 09:37:00 PM
2013/04/16 11:23:00 AM
2013/04/14 09:47:00 PM
2013/04/05 07:29:00 PM
2013/03/29 03:12:00 PM
2013/04/06 07:43:00 AM
2013/04/16 01:08:00 AM

文本文件包含时间列表。我想读入这个文本文件并按 ASCENDING 顺序排列这些时间并删除重复的时间。 然后在 MVC 解决方案的页面上显示这些时间,如下所述。

日期时间必须按天和周分组,并且还必须显示空周或天。输出必须如下所示(这只是一个示例):

周:4 月 28 日星期日至 5 月 4 日星期六

4 月 28 日星期日

4 月 29 日星期一
2013/04/29 03:12:00 AM

4 月 30 日星期二
2013/04/30 下午 1:16:00
2013/04/30 下午 05:01:00

5 月 1 日星期三
2013/05/01 06:33:00 AM

5 月 2 日星期四

5 月 3 日星期五

5 月 4 日星期六

【问题讨论】:

    标签: c# linq date asp.net-mvc-5


    【解决方案1】:

    首先,您需要定义将用于所有文本转换的 CultureInfo。您示例中的那些看起来像美国,所以让我们使用那个。

    CultureInfo culture = new CultureInfo("en-us");
    

    然后您需要将这些文本行解析为 DateTimes,以便您可以使用它们。 Distinct 将确保没有重复,OrderBy 将使用默认的 DateTime 比较(升序)对结果进行排序

    //Use full path instead of "input.txt"
    IEnumerable<DateTime> datesInFile = File.ReadAllLines(@"input.txt")
        .Select(s => DateTime.Parse(s, culture))
        .Distinct()
        .OrderBy(d => d);
    

    可以通过从指定日期开始迭代 7 天来枚举一周中的天数。

    //This date should probably come from somewhere else
    DateTime startDate = new DateTime(2013, 04, 08);
    IEnumerable<DateTime> datesInWeek = Enumerable.Range(0, 6)
        .Select(d => startDate.Date.AddDays(d));
    

    由于您每天都需要所有时间戳,因此您需要按日期对它们进行分组。 ToDictionary 期望 lambdas:第一个是 key(日期),第二个是 value(当天的时间戳列表) .

    Dictionary<DateTime, IEnumerable<DateTime>> result = datesInWeek
        .ToDictionary(
            d => d, 
            d => datesInFile.Where(dif => d.Date == dif.Date));
    

    最后,您可以获取结果并汇总它们(当然以指定的文化和格式)

    string outputText = result.Aggregate("", 
        (current, pair) => current + 
        pair.Key.ToString("ddd MMM d", culture) + 
        Environment.NewLine + 
        String.Join(Environment.NewLine, pair.Value.Select(
            d => d.ToString("MM/dd/yyyy hh:mm:ss tt", culture))) + 
        Environment.NewLine);
    

    精简版:

    CultureInfo culture = new CultureInfo("en-us");
    
    IEnumerable<DateTime> datesInFile = File
        .ReadAllLines(@"C:\Temp\input.txt")
        .Select(s => DateTime.Parse(s, culture))
        .Distinct()
        .OrderBy(d => d);
    
    string outputText = Enumerable
        .Range(0, 6)
        .Select(d => new DateTime(2013,04,08).Date.AddDays(d))
        .ToDictionary(d => d, d => datesInFile.Where(dif => d.Date == dif.Date))
        .Aggregate("", (current, pair) => current + pair.Key.ToString("ddd MMM d", culture) + Environment.NewLine + 
            String.Join(Environment.NewLine, pair.Value.Select(d => d.ToString("MM/dd/yyyy hh:mm:ss tt", culture))) + 
            Environment.NewLine);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-27
      • 1970-01-01
      • 2023-04-01
      • 2020-08-15
      • 2020-04-19
      相关资源
      最近更新 更多