2012-06-07 114 views
0

我想通过包含两个字段的列表(csv)循环;一个名字和一个日期。列表中有各种重复的名称和各种日期。我试图推导出列表中的每个名称,其中有多个相同名称的实例,哪个相应的日期是最新的。如何在循环列表时比较DateTime对象?

我知道,从另一个答案看,我需要使用DateTime.Compare方法,这很好,但我的问题是确定哪个日期晚。一旦我知道这一点,我需要生成一个具有唯一名称和最新日期的文件。

这是我第一个让我成为新手的问题。

编辑:

起初,我认为这将是“OK”的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()); 
        } 

       } 
      } 

     } 


    } 
} 

}

任何帮助表示赞赏。 谢谢。

+1

“我意识到,从看另一个答案,我需要使用DateTime.Compare方法”嗯...哪个答案?你有链接吗?为什么你不能只使用'dt1.Date

+0

我不确定你在找什么。您在说“我的问题是确定哪个日期晚点”,但是您的代码已经可以解决问题了。你能不能更新你的问题文本,使实际的问题/问题更明显?供参考; –

+1

供参考; “StreamWriter”最好置于using语句中,以确保在不再需要时将其从内存中移除。 [链接](http://www.dotnetperls.com/streamwriter) – Coops

回答

2

all in one,使用Datetime上的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) 
          }); 
+0

好的。去看看这个,看看我得到了什么结果。谢谢。 – Taniq

+0

所以。我已经实现了这种编码,它的工作非常好...还没有线索,因为我以前从来没有见过这样的脚本(地狱,我真的觉得现在像一个新手...)谢谢再次。 – Taniq

+0

那么,欢迎linq,我试着评论一下,如果它有帮助...但更多的阅读将需要。 –