如何从文本文件中读取日期,将其分配给日期并在 C# Linq 中删除重复的日期

本文关键字:日期 Linq 删除 文件 文本 读取 取日期 分配 | 更新日期: 2024-11-05 19:50:30

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

输入.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

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

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

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

4月28日星期日

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

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

周三 5月 1
2013/05/01 06:33:00 上午

5月2日星期四

周五 5月 3

5月4日星期六

如何从文本文件中读取日期,将其分配给日期并在 C# Linq 中删除重复的日期

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

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:第一个是(日期),第二个是(当天的时间戳列表)。

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