2016-04-22 8 views
0

この演習にはどのようにアプローチできますか?私はLINQを使ってテキストファイルを読む方法を知らない。私はこれにどのようにアプローチできるか誰にでも考えていますか?テキストファイルから日付を読み取って日付に割り当て、C#Linqで重複する日付を削除するには

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 

INPUT.TXTテキストファイルは、時間のリストが含まれています。私はこのテキストファイルを読み込み、これらの時間をASCENDING順に並べ、重複した時間を削除したい。 次に、これらの時間を以下に説明するようにMVCソリューションのページに表示します。

日時は、曜日と週でグループ化し、空の週または日も表示する必要があります。

ウィーク:土曜日月の日曜日4月28日4

日4月28日

月4月29日
2013年4月29日03出力は次のように(これは単なる一例)を見なければなりません:12:00 AM

火4月30日
2013年4月30日午前1時16分00秒PM
2013年4月30日5時01分00秒PM

水5月1日
2013年5月1日午前6時33分00秒AM

木5月2日

金5月3日

土5月4日

答えて

3

まずあなたがを定義する必要がありますCultureInfoあなたはすべてのテキスト変換に使用します。あなたの例は米国のように見えるので、そのようなものを使うことができます。

CultureInfo culture = new CultureInfo("en-us"); 

次に、これらのテキスト行をDateTimesとして解析する必要があります。 個別には、重複して[並べ替えがないことを確認します曜日が指定された日付から始まる7日間反復することによって列挙することができ、デフォルトの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); 

で結果をソートします。

//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はlambdaを期待しています。最初はキー(日付)、(その日のタイムスタンプのリスト)です。

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); 
関連する問題