【问题标题】:Nested Lists, dynamically adding a string to a list based on a date value嵌套列表,根据日期值动态将字符串添加到列表中
【发布时间】:2013-05-29 17:33:57
【问题描述】:

我有一个文件,其中包含由换行符分隔的多个数据条目,每个条目都有一个日期。 知道这个日期后,我想将这些条目放入一个基于等效天数的列表中——但我只关心距当前日期 7 天内的日期。然后我有一个包含这 7 个列表的顶级列表,其中再次包含包含该特定日期的条目。

这是我目前所拥有的:

    static void Main(string[] args)
    {
        List<List<string>> week = new List<List<string>>(7);

        List<string> day = new List<string>();
        FileInfo fi = new FileInfo("TestCases.txt"); 
        StreamReader reader = fi.OpenText();
        string line;
        DateTime current = DateTime.Now;
        int currentday = current.DayOfYear;
        while ((line = reader.ReadLine()) != null)
        {
            string[] data = line.Split(',');
            DateTime date = DateTime.Parse(data[0]);
            int dateday = date.DayOfYear;
            int diff = dateday - currentday;
            if (diff < 0) diff += 365;
            if (diff >= 0 && diff < 7)
            {
                day.Add(line);
            }
            week.Add(day);
        }
        Display(week);
        Console.ReadKey();

     }

还有我的显示功能:

    static void Display(List<List<string>> list)
    {
        foreach (var sublist in list)
        {
            foreach (var value in sublist)
            {
                Console.Write(value);
                Console.Write('\n');
            }
            Console.WriteLine();
        }

    }

这将输出所有适当的条目(在接下来的 7 天内出现的条目) 但它最终会将所有条目添加到一个列表中,并将同一个列表连续 7 次放入我的顶级列表中。

我对从这里开始的进展有一个粗略的想法,但我对 C# 不太熟悉,而且我不断收到错误,而且谷歌并没有给我太多帮助。

感谢您的宝贵时间

【问题讨论】:

    标签: c#


    【解决方案1】:

    第一:

    List<List<string>> week = new List<List<string>>(7);
    for (int i = 0; i < 7; i++)
        week[i] = new List<string>();
    

    然后:

    if (diff >= 0 && diff < 7)
    {
        week[diff].Add(line);
    }
    

    尚未对其进行测试,但它似乎是您想要的。您应该将日期添加到您想要的星期几,而您现在正在做的是将所有日期添加到同一个列表中,而不是重新创建它们并且不以任何方式分组。

    鉴于上述情况,这可能可以通过一些 linq 更好地解决 - 更好意味着更清洁和可读。

    编辑:

    如果您将所有日期放入列表中,您可以执行以下操作:

    var dates = new List<DateTime>
    {
        DateTime.Now.AddDays(-1),
        DateTime.Now.AddDays(-2),
        DateTime.Now.AddDays(-3),
        DateTime.Now.AddDays(-4),
        DateTime.Now.AddDays(-5),
        DateTime.Now.AddDays(-6),
        DateTime.Now.AddDays(-7),
        DateTime.Now.AddDays(-8)
    };
    
    var list = from date in dates
               where (DateTime.Now - date).Days < 7
               group date by date.Day;
    
    foreach (var dateGroup in list)
    {
        Console.WriteLine("Date group: " + dateGroup.Key);
        foreach (var date in dateGroup)
        {
            Console.WriteLine(date);
        }
    }
    

    导致相同的输出。不是列表中的列表,而是分组的集合。更容易获得代码应该做什么。

    【讨论】:

    • 非常接近,对于 (int i = 0; i ());结束了工作。谢谢!
    • 非常感谢 linq 编辑!自从您提到它以来,我一直在了解更多有关它的信息,但感谢您花时间和精力给我一个适用的例子。如果我有 15 名声望,我会将您标记为有帮助:3
    • 很高兴我能帮上忙。 Linq 是非常强大的工具,因此值得花一些时间学习它。玩得开心,祝你好运:)
    猜你喜欢
    • 2021-01-26
    • 1970-01-01
    • 2021-01-23
    • 2016-02-08
    • 2022-12-15
    • 1970-01-01
    • 2018-03-05
    • 2013-01-22
    • 1970-01-01
    相关资源
    最近更新 更多