2016-10-20 4 views
0

商品IDが一致するすべてのファイル(M320.1215など)で構成されるリストを絞り込むことを試みています。私はそれを絞り込む必要があると言うとき、私はリストの最新のアイテムだけを保持するためにリストのエントリを削除したい。一致する文字列のパラメータを持つリストから項目を削除する最も最近の日付時刻

これは、ファイル名の例です。ここでI_ATTRIBUTES_M320.1215_EGHS_CS_07112016225939.xlsx

あなたが「M320.1215」 Subformatでと言語「EGHS_CS」 と日時07112016225939のように製品IDを参照してください形式MMDDYYYYHHMMSS。

public DateTime correctedDateString(string dts) 
    { 
     string correctDTS = dts.Insert(2, "/"); 
     correctDTS = correctDTS.Insert(5, "/"); 
     correctDTS = correctDTS.Insert(10, " "); 
     correctDTS = correctDTS.Insert(13, ":"); 
     correctDTS = correctDTS.Insert(16, ":"); 
     DateTime convertedDate = DateTime.Now; 
     try 
     { 
      convertedDate = Convert.ToDateTime(correctDTS); 
      Console.WriteLine("'{0}' converts to {1} {2} time.", correctDTS, convertedDate, convertedDate.Kind.ToString()); 
     } 
     catch (FormatException) 
     { 
      convertedDate = Convert.ToDateTime("01/01/2015 00:00:00"); 
      Console.WriteLine("'{0}' is not in the proper format.", correctDTS); 
     } 
     return convertedDate; 

これは明らかに簡単な方法です。

string[] tempArray = Path.GetFileNameWithoutExtension(filenames[i].ToString()).ToString().Split(new[] { "_" }, StringSplitOptions.None); 

今、私は唯一の次のリストを操作するとされて苦労していますどのような各サブフォーマットや言語コンボの最新バージョンを保持:私は、使用可能なセグメントにリスト内の項目を分割するために、次を使用している 。

List<string> filenames = new List<string>() 
     { 
      "I_ATTRIBUTES_M320.1215_EGHS_RU_07132016020215", 
      "I_ATTRIBUTES_M320.1215_EGHS_BE_06292016132122", 
      "I_ATTRIBUTES_M320.1215_EGHS_BE_06302016100039", 
      "I_ATTRIBUTES_M320.1215_EGHS_BE_07042016080530", 
      "I_ATTRIBUTES_M320.1215_EGHS_BE_07112016225936", 
      "I_ATTRIBUTES_M320.1215_EGHS_BE_07132016020203", 
      "I_ATTRIBUTES_M320.1215_EGHS_BR_06292016132127", 
      "I_ATTRIBUTES_M320.1215_EGHS_BR_06302016100042", 
      "I_ATTRIBUTES_M320.1215_EGHS_BR_07042016080536", 
      "I_ATTRIBUTES_M320.1215_EGHS_BR_07112016225938", 
      "I_ATTRIBUTES_M320.1215_EGHS_BR_07132016020206", 
      "I_ATTRIBUTES_M320.1215_EGHS_CS_07112016225939", 
      "I_ATTRIBUTES_M320.1215_EGHS_CS_07132016020207", 
      "I_ATTRIBUTES_M320.1215_EGHS_DE_06292016132128", 
      "I_ATTRIBUTES_M320.1215_EGHS_DE_06302016100044", 
      "I_ATTRIBUTES_M320.1215_EGHS_DE_07042016080537", 
      "I_ATTRIBUTES_M320.1215_EGHS_DE_07112016225940", 
      "I_ATTRIBUTES_M320.1215_EGHS_DE_07132016020208", 
      "I_ATTRIBUTES_M320.1215_EGHS_FR_06292016132129", 
      "I_ATTRIBUTES_M320.1215_EGHS_FR_06302016100045", 
      "I_ATTRIBUTES_M320.1215_EGHS_FR_07042016080538", 
      "I_ATTRIBUTES_M320.1215_EGHS_FR_07112016225941", 
      "I_ATTRIBUTES_M320.1215_EGHS_FR_07132016020210", 
      "I_ATTRIBUTES_M320.1215_EGHS_IT_06292016132129", 
      "I_ATTRIBUTES_M320.1215_EGHS_IT_06302016100046", 
      "I_ATTRIBUTES_M320.1215_EGHS_IT_07042016080539", 
      "I_ATTRIBUTES_M320.1215_EGHS_IT_07112016225941", 
      "I_ATTRIBUTES_M320.1215_EGHS_IT_07132016020211", 
      "I_ATTRIBUTES_M320.1215_EGHS_MS_06292016132130", 
      "I_ATTRIBUTES_M320.1215_EGHS_MS_06302016100047", 
      "I_ATTRIBUTES_M320.1215_EGHS_MS_07042016080540", 
      "I_ATTRIBUTES_M320.1215_EGHS_MS_07112016225943", 
      "I_ATTRIBUTES_M320.1215_EGHS_MS_07132016020212", 
      "I_ATTRIBUTES_M320.1215_EGHS_PL_06292016132131", 
      "I_ATTRIBUTES_M320.1215_EGHS_PL_06302016100048", 
      "I_ATTRIBUTES_M320.1215_EGHS_PL_07042016080541", 
      "I_ATTRIBUTES_M320.1215_EGHS_PL_07112016225944", 
      "I_ATTRIBUTES_M320.1215_EGHS_PL_07132016020214", 
      "I_ATTRIBUTES_M320.1215_EGHS_RU_06292016132131", 
      "I_ATTRIBUTES_M320.1215_EGHS_RU_06302016100049", 
      "I_ATTRIBUTES_M320.1215_EGHS_RU_07042016080542", 
      "I_ATTRIBUTES_M320.1215_EGHS_RU_07112016225945" 
     }; 

だから基本的に私は次のように最終的なリストを必要とする:

List<string> filenames = new List<string>() 
     { 
      "I_ATTRIBUTES_M320.1215_EGHS_BE_07132016020203", 
      "I_ATTRIBUTES_M320.1215_EGHS_BR_07132016020206", 
      "I_ATTRIBUTES_M320.1215_EGHS_CS_07132016020207", 
      "I_ATTRIBUTES_M320.1215_EGHS_DE_07132016020208", 
      "I_ATTRIBUTES_M320.1215_EGHS_FR_07132016020210", 
      "I_ATTRIBUTES_M320.1215_EGHS_IT_07132016020211", 
      "I_ATTRIBUTES_M320.1215_EGHS_MS_07132016020212", 
      "I_ATTRIBUTES_M320.1215_EGHS_PL_07132016020214", 
      "I_ATTRIBUTES_M320.1215_EGHS_RU_07132016020215" 
     }; 

は、任意の助けを事前にありがとうございます。

答えて

1

あなたは、あなたが特定の項目を検索し、選択した項目を削除するにはList<T>.Remove(T)メソッドを使用するようにList<T>.Find(Predicate<T>)メソッドを使用することができますLINQの

var grouped = filenames.Select(x => x.Split('_')) 
    .GroupBy(x => x[2] + x[3] + x[4], p => p, (key, g) => new { Id = key, Items = g.ToList() }) 
    .Select(x => x.Items.OrderByDescending(i => correctedDateString(i[5])).FirstOrDefault()) 
    .Select(x => string.Join("_", x)) 
    .ToList(); 
+0

こんにちは、フィードバックありがとうございます。私はLinqのものについて読まなければならないでしょう。私は自分自身を教えるために忙しいです。 –

+0

なぜあなたのコードはOrderByDescending(correctedDateString(i => i [5]))でエラーを起こすのですか?ラムダについて何か言って、i => i [5]に下線を引いていますか? –

+0

謝罪、私はコードを修正しました。 OrderByDescending(i => correctedDateString(i [5])) – pieperu

0

でこれを行うことができます。

例:私はあなたの代わりにcorrectedDateString方法のDataTime.ParseExact方法を使用してい

var result = filenames.Select(s => 
{ 
    var splitted = s.Split('_'); 
    return new 
    { 
     ProductId = splitted[2], 
     Subformat = splitted[3], 
     Language = splitted[4], 
     DateTime = DateTime.ParseExact(splitted[5], "MMddyyyyHHmmss", null), 
     Source = s 
    }; 
}) 
.GroupBy(a => new { a.ProductId, a.Subformat, a.Language }) 
.Select(g => g.First(a => a.DateTime == g.Max(b => b.DateTime)).Source) 
.ToList(); 

// Find an Employee by their ID. 
Employee result = Employees.Find(
    delegate(Employee emp) 
    { 
     return emp.ID == IDtoFind; 
    } 
); 
0

はこれを試してみてください。

+0

こんにちは、あなたの方法は結果を生成しますが、ファイルの最新のバージョンを提供していないようです。それはちょうど各サブフォーマットとlangugeの最初の項目を返すようです。 –

+0

@WDavison - 最初のmax - i。 e。最近。多分私は間違っています。 –

関連する問題