0

2 つのフィールドを含むリスト (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());
                    }

                }
            }

        }


    }
}

}

どんな助けでも感謝します。ありがとう。

4

1 に答える 1

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)
                             });
于 2012-06-07T09:39:42.523 に答える