我该如何处理这个练习?我不知道如何使用LINQ读取文本文件。有没有人知道如何处理这个问题?
input.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
文本文件包含一系列时间。我想阅读此文本文件并按ASCENDING顺序排序这些时间并删除重复次数。 然后在MVC解决方案的页面上显示这些时间,如下所述。
日期时间必须按天和周分组,并且还必须显示空的周或天。输出必须如下所示(这只是一个例子):
周:4月28日星期日至5月4日星期六
Sun 4月28日
星期四4月29日 2013/04/29 03:12:00 AM
4月30日星期二
2013/04/30 01:16:00 PM
2013/04/30 05:01:00 PM
5月1日星期三 2013/05/01 06:33:00 AM
5月2日星期五
5月3日星期五
5月4日星期六
答案 0 :(得分:3)
首先,您需要定义您将用于所有文本转换的 CultureInfo 。你的例子中的那些看起来像美国,所以让我们使用那个。
CultureInfo culture = new CultureInfo("en-us");
然后,您需要将这些文本行解析为DateTimes,以便您可以使用它们。 区别将确保没有重复项, 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);