C# 嵌套列表,基于日期值向列表动态添加字符串

C# 嵌套列表,基于日期值向列表动态添加字符串,c#,C#,我有一个文件,其中有几个数据条目,用换行符分隔,每个条目都有一个日期。 知道这个日期后,我想将这些条目放在一个基于等效日期的列表中——但我只关心距离当前日期7天以内的日期。然后,我有一个顶级列表,其中包含这7个列表,其中再次包含包含该特定日期的条目 以下是我到目前为止的情况: static void Main(string[] args) { List<List<string>> week = new List<List<str

我有一个文件,其中有几个数据条目,用换行符分隔,每个条目都有一个日期。 知道这个日期后,我想将这些条目放在一个基于等效日期的列表中——但我只关心距离当前日期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 Main(字符串[]args)
{
列表周=新列表(7);
列表日=新列表();
FileInfo fi=newfileinfo(“TestCases.txt”);
StreamReader=fi.OpenText();
弦线;
DateTime current=DateTime.Now;
int currentday=当前的年日期;
而((line=reader.ReadLine())!=null)
{
string[]data=line.Split(',');
DateTime date=DateTime.Parse(数据[0]);
int dateday=date.DayOfYear;
int diff=日期日-当前日;
如果(diff<0)diff+=365;
如果(差异>=0&&diff<7)
{
添加(行);
}
周。添加(天);
}
显示(周);
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();
        }

    }
静态无效显示(列表)
{
foreach(列表中的var子列表)
{
foreach(子列表中的var值)
{
控制台。写入(值);
Console.Write('\n');
}
Console.WriteLine();
}
}
这将输出所有适当的条目(在未来7天内出现的条目) 但它最终将所有条目添加到一个列表中,并将相同的列表在我的顶级列表中连续7次

我大致知道从这里可以取得什么进展,但我对C#不太熟悉,而且我经常出错&谷歌对我帮助不大

首先感谢您抽出宝贵的时间:

List<List<string>> week = new List<List<string>>(7);
for (int i = 0; i < 7; i++)
    week[i] = new List<string>();
列表周=新列表(7);
对于(int i=0;i<7;i++)
周[i]=新列表();
然后:

if(diff>=0&&diff<7)
{
周[diff]。添加(行);
}
还没有测试过,但它似乎是你想要的。您应该将日期添加到所需的星期几,现在您要做的是将所有日期添加到同一个列表中,而不是重新创建它们,也不是以任何方式进行分组

鉴于上述情况,使用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);
    }
}
var日期=新列表
{
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)
};
变量列表=日期中的起始日期
其中(DateTime.Now-date).Days<7
按日期分组日期。天;
foreach(列表中的var日期组)
{
Console.WriteLine(“日期组:+dateGroup.Key”);
foreach(日期组中的var日期)
{
控制台写入线(日期);
}
}

产生相同的输出。不是列表中的列表,而是分组的集合。更容易获得代码应该执行的操作。

非常接近(int i=0;i<7;i++)周。添加(new List());最后工作了。谢谢非常感谢linq编辑!自从你提到它以来,我已经了解了更多,但是谢谢你花时间和精力给我一个适用的例子。如果我有15个名声,我会认为你很有帮助:3很高兴我能帮上忙。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);
    }
}