我正在尝试遍历包含两个字段的列表(csv);姓名和日期。列表中有各种重复的名称和各种日期。我正在尝试推断列表中的每个名称,其中有多个同名实例,相应的日期是最新的。
通过查看另一个答案,我意识到我需要使用DateTime.Compare方法,这很好,但我的问题是确定哪个日期更晚。一旦我知道这一点,我需要生成一个具有唯一名称的文件以及与之相关的最新日期。
这是我第一个让我成为新手的问题。
编辑:
最初我认为将LatestDate对象设置为不会显示在我的文件中的日期是“可以的”,因此在文件中的任何更晚日期都是LatestDate。
到目前为止,这是我的编码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace flybe_overwriter
{
class Program
{
static DateTime currentDate;
static DateTime latestDate = new DateTime(1000,1,1);
static HashSet<string> uniqueNames = new HashSet<string>();
static string indexpath = @"e:\flybe test\indexing.csv";
static string[] indexlist = File.ReadAllLines(indexpath);
static StreamWriter outputfile = new StreamWriter(@"e:\flybe test\match.csv");
static void Main(string[] args)
{
foreach (string entry in indexlist)
{
uniqueNames.Add(entry.Split(',')[0]);
}
HashSet<string>.Enumerator fenum = new HashSet<string>.Enumerator();
fenum = uniqueNames.GetEnumerator();
while (fenum.MoveNext())
{
string currentName = fenum.Current;
foreach (string line in indexlist)
{
currentDate = new DateTime(Convert.ToInt32(line.Split(',')[1].Substring(4, 4)),
Convert.ToInt32(line.Split(',')[1].Substring(2, 2)),
Convert.ToInt32(line.Split(',')[1].Substring(0, 2)));
if (currentName == line.Split(',')[0])
{
if(DateTime.Compare(latestDate.Date, currentDate.Date) < 1)
{
// Console.WriteLine(currentName + " " + latestDate.ToShortDateString() + " is earlier than " + currentDate.ToShortDateString());
}
else if (DateTime.Compare(latestDate.Date, currentDate.Date) > 1)
{
// Console.WriteLine(currentName + " " + latestDate.ToShortDateString() + " is later than " + currentDate.ToShortDateString());
}
else if (DateTime.Compare(latestDate.Date, currentDate.Date) == 0)
{
// Console.WriteLine(currentName + " " + latestDate.ToShortDateString() + " is the same as " + currentDate.ToShortDateString());
}
}
}
}
}
}
}
任何帮助表示赞赏。 感谢。
答案 0 :(得分:2)
一体化,使用Datetimes上的Max()函数代替进行自己的测试。
var result = indexList
//"transform" your initial list of strings into an IEnumerable of splitted strings (string[])
.Select(list => list.Split(','))
//in this new List of string[], select the first part in text, select and Convert the second part in DateTime.
//We now have an IEnumerable of anonymous objects, composed of a string and a DateTime Property
.Select(splittedList => new
{
text = splittedList[0],
date = new DateTime(Convert.ToInt32(splittedList[1].Substring(4, 4)),
Convert.ToInt32(splittedList[1].Substring(2, 2)),
Convert.ToInt32(splittedList[1].Substring(0, 2)))
})
//group that new List by the text Property (one "entry" for each distinct "text").
//GroupBy creates an IGrouping<out TKey, out TElement>, kind of special dictionary, with an IEnumerable<TResult> as "value" part
//(here an IEnumerable of our anonymous object)
.GroupBy(textDateTimeList => textDateTimeList.text)
//from this grouping, take the "key" (which is the "distinct text", and in the IEnumerable<anonymousObject>, take the Max Date.
//We now have a new List of anonymous object, with a string Property and a DateTime Property
.Select(group => new
{
stringField = group.Key,
maxDateField = group.Max(dateField => dateField.date)
});