首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# Dictionary 實現鍵值多對一映射的兩種標準模式

     編輯:程式設計綜合問答

場景

需求:一個 Key 對應多個 Value(如:用戶 ID → 多個訂單 ID),但 Dictionary<TKey, TValue> 強制 Key 唯一。

模式一:Dictionary<TKey, List<TValue>>(可變集合)


var dict = new Dictionary<int, List<string>>();
dict.Add(1, new List<string> { "OrderA", "OrderB" });
dict[1].Add("OrderC"); // 追加
// 遍歷
foreach (var kvp in dict) {
    Console.WriteLine($"User {kvp.Key}: {string.Join(",", kvp.Value)}");
}

適用於:頻繁增刪 Value、需按 Key 快速查找所有 Value。

模式二:List<KeyValuePair<TKey, TValue>>(扁平列表)


var pairs = new List<KeyValuePair<int, string>>();
pairs.Add(new KeyValuePair<int, string>(1, "OrderA"));
pairs.Add(new KeyValuePair<int, string>(1, "OrderB"));
// LINQ 分組查詢
var userOrders = pairs.Where(p => p.Key == 1).Select(p => p.Value);

適用於:數據量小、主要順序遍歷、需保留插入順序、或需序列化為簡單數組。

進階:ILookup<TKey, TValue> (唯讀、自動分組)


var lookup = pairs.ToLookup(kvp => kvp.Key, kvp => kvp.Value);
// lookup[1] → IEnumerable<string>,無 KeyNotFoundException,語義純粹

選型建議:寫多讀少 → Dictionary<List>;讀多寫少/一次性構建 → ILookup;簡單序列化傳輸 → List<KeyValuePair>。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved