如何排序和输出存储在列表中的数据

时间:2014-08-27 14:44:57

标签: c# linq sorting loops timespan

我有一个应用程序,它读取带有日期的文本文件。

请注意我还在学习C#

文本文件中的内容是这样的: ,即我的内容未排序,但我已将它们存储在列表中并按ASC顺序排序。

02/10/1998
03/10/1998
07/10/1998
10/10/1998
17/10/1998
20/10/1998

文本文件有更多的100个日期,因为我使用的是手机,我无法输入所有文字,也无法写入整个代码。

基本上,应用程序的目的是写入一个新的文本文件,内容包含来自时间跨度的**周块 即:

Week : Sunday 27 1998 to Saturday 03 1998
Friday 02 1998
Fri 2 98
02/10/98
Saturday 03 1998
Sat 2 98
03/10/1998
Week : Sunday 04 1998 to Saturday 10 1998
Wednesday 07 1998
Wed 7 98
07/10/1998
Saturday 10 1998
Sat 10 98
10/10/1998

//And so on till last date

输出应始终从第一个星期日到星期六开始,到最后一个星期日到星期六结束。

我需要知道的是如何通过从时间跨度 <周>来生成这样的输出?

我已经编写了从列表中排序的代码,现在我认为我必须解析日期格式

var sortedlist = stulist.OrderBy(s => s.DOB);

DateTime dt = DateTime.ParseExact(line, "ddddMMMMdd", CultureInfo.InvariantCulture);
DateTime dt2 = DateTime.ParseExact(line, "dddMMMd", CultureInfo.InvariantCulture);
DateTime dt3 = DateTime.ParseExact(line, "MM/dd/yyyy", CultureInfo.InvariantCulture);

我想我必须循环但我无法弄清楚在 while循环中要指定的内容。

非常感谢任何帮助

会有什么不同:

tx.WriteLine(dt.ToString("dddd dd yyyy", CultureInfo.InvariantCulture));
如果我保留ParseExact,

有什么用?

tx.WriteLine(dt);

2 个答案:

答案 0 :(得分:2)

你的问题有点令人困惑。我试着概括一下你可能在做什么。您似乎有一个Student类,其中包含一个字段DOB。我假设它是DateTime类型。然后你必须做这样的事情才能阅读文本文件:

var students = new List<Student>();
string[] lines = File.ReadAllLines("my file path");
CultureInfo southAfricanCuture = new CultureInfo("en-ZA");
foreach (string l in lines) {
    DateTime d;
    if (DateTime.TryParseExact(l, "dd/MM/yyyy", southAfricanCuture,
                               DateTimeStyles.AllowWhiteSpaces, out d))
    {
        students.Add(new Student { DOB = d });
    }
}

我们需要使用TryParseExact才能拥有正确的日期和月份顺序。但也许我只是在使用错误的文化。

即。将以文本形式提供的日期转换为DateTime时会发生解析。为了显示日期,稍后,您必须通过格式化它们(而不是解析!)将它们转换回string

继续,我们需要这个辅助方法:

public static DateTime FirstDateOfWeek(DateTime date)
{
    // Since Sunday = 0 and we want sunday to be the first day of week:
    int dayOfWeek = (int)date.DayOfWeek;
    return date.AddDays(-dayOfWeek);
}

现在,让我们使用LINQ创建日期块(确保代码的开头有using System.Linq;):

var dtfi = DateTimeFormatInfo.InvariantInfo;
Calendar cal = dtfi.Calendar;

var dateBlocks = students
    .Select(s => s.DOB)
    .GroupBy(d => 100 * d.Year +
                  cal.GetWeekOfYear(d, CalendarWeekRule.FirstDay, DayOfWeek.Sunday))
    .OrderBy(g => g.First()); // Order the groups by first date found in them.

现在,让我们创建输出:

foreach (var block in dateBlocks) {
    // Week header
    DateTime firstDayOfWeek = FirstDateOfWeek(block.First());
    DateTime lastDayOfWeek = firstDayOfWeek.AddDays(6);
    string weekHeader = String.Format(southAfricanCuture,
        "Week : {0:dddd dd/MM yyyy} to {1:dddd dd/MM yyyy}",
        firstDayOfWeek, lastDayOfWeek);
    Console.WriteLine(weekHeader);

    // Week details.
    // If the dates appear in wrong order in the input file,
    // order the days within the groups.
    foreach (DateTime date in block.OrderBy(d => d)) {
        Console.WriteLine(date.ToString("    dddd dd/MM yyyy", southAfricanCuture));
        Console.WriteLine(date.ToString("    ddd d/M yy", southAfricanCuture));
        Console.WriteLine(date.ToString("    dd/MM/yy", southAfricanCuture));
    }
}
Console.ReadKey();

如您所见,使用日期是一件复杂的事情。

答案 1 :(得分:1)

这个qwestion中有一个linq标签。我试图在linq中做到这一点

使用值

创建列表
    var lst = new List<string> {"02/10/1998",
    "03/10/1998",
    "07/10/1998",
    "10/10/1998",
    "17/10/1998",
    "20/10/1998"
    };

日期时间值列表

var DateList = (from value in lst
                   select DateTime.ParseExact(value, "dd/MM/yyyy",
                       CultureInfo.InvariantCulture)).ToList();

让我们的列表更有用

List<MyClass> lst3 = DateList.Select(p => new MyClass
        {
            DT = p,
            WeekOfYear = CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(p , DateTimeFormatInfo.CurrentInfo.CalendarWeekRule, DayOfWeek.Monday),
            FirstDayOfWeek = p.AddDays(DayOfWeek.Monday - p.DayOfWeek),
            LastDayOfWeek = p.AddDays(DayOfWeek.Sunday - p.DayOfWeek)
        }).OrderBy(x=>x.WeekOfYear).ToList();

现在您可以显示结果

 int current_week=-1;
        foreach (MyClass o in lst3)
        {
            if (current_week > o.WeekOfYear)
            {
                current_week = o.WeekOfYear;
                Console.WriteLine("Week: {0} {1} to {2} {3}", o.FirstDayOfWeek.DayOfWeek.ToString() ,o.FirstDayOfWeek, o.LastDayOfWeek.DayOfWeek.ToString(), o.LastDayOfWeek);
            }
            Console.WriteLine("{0} {1}", o.DT.DayOfWeek.ToString(), o.DT);
        }