利用Dictionary的特性處理尾端資料符合問題

  • 688
  • 0

Dicitonary<TKey,TValue> 索引子的應用。

在網路上看到一個有趣的問題,假設有以下的 csv 資料:

072000,xxxx
073100,aaaa
074200,aaaa
075300,abbb
076400,bbbb
076500,baaa
078900,abbb

我們根據第二個項目來判定是否為同一筆資料,例如 "073100,aaaa" 和 "074200,aaaa" 的第二項都是 "aaaa" 判定為相同資料,則排除第一筆資料,只保留第二個 "074200,aaaa"。

解法當然有很多,其中一種是利用 Dictionary 的特性來解決。Dictionary<TKey, TValue> 的 Indexer 有一個很有趣的特性,當你使用 Dictionary[TKey] 去設定某個 key 所對應的 value 時,若是 key 存在,會替換該值;但 key 若是不存在,則會新增這個 key。以下我們利用這個特性來解決上述的問題。

 class Program
 {
     async static Task Main(string[] args)
     {
         foreach (var item in await ReadAsync("TextFile1.txt"))
         {
             Console.WriteLine($"{item.Key} : {item.Value}");
         }
         Console.ReadLine();
     }

     async static ValueTask<Dictionary<string, string>> ReadAsync(string path)
     {
         var result = new Dictionary<string, string>();
         using (StreamReader reader = File.OpenText(path))
         {
             while (await reader.ReadLineAsync() is string line)
             {
                 var content = line.Split(',');
                 result[content[1]] = content[0];
             }
         }
         return result;
     }
 }

主要就是 result[content[1]] = content[0] 這行程式碼的作用讓我們取得正確的結果。相關範例在 github 可以下載 (使用 C# 8.0 + .NET Core 3.0)。