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)。