2014-08-27 106 views
1

我有一个应用程序读取日期文本文件。如何排序和输出存储在列表中的数据

请注意,我仍然在学习C#

在文本文件中的内容是这样的: 即我的内容没有进行排序,但我已经将它们存储在列表和ASC排序订购。

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

文本文件还有更多的一百日期,由于这样的事实,我使用的是手机,我无法输入的所有文本,不能写整个代码。

基本的应用程序的目的是为了写一个新的文本文件,内容与**周块从时间跨度 即:

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

您应该编辑您的问题,并阐明你真的想知道如何从一个时间跨度让那些一周块。目前还不清楚这个或日期时间格式是否是您问题的核心。告知我 – 2014-08-27 15:00:20

+0

@TimSchmelter感谢,我editted。 – Brian02 2014-08-27 15:09:15

+0

你想拥有所有为期一周的块或仅针对您也有日期显示? – 2014-08-27 15:49:52

回答

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。但也许我只是在使用错误的文化。

I.e.将文本提供的日期转换为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(); 

正如你可以看到,随着d工作ates是一件复杂的事情。

+0

谢谢,这是我一直在寻找,所以基本上我应该使用date.ToString我输出 – Brian02 2014-09-04 11:15:53

1

有这qwestion.I一个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); 
     } 
+0

这应该工作,在我张贴了这个问题,我是一个初学者的时间当谈到LINQ时。 – Brian02 2015-07-03 09:11:28

+0

@ Brian02你是什么意思?这个答案对你有帮助吗? – 2015-07-17 14:02:21

+0

是的,它确实有效。谢谢 – Brian02 2015-07-20 09:48:24

相关问题