我有兩本詞典
Dictionary<string, string> dictionary1 = new Dictionary<string, string>();
Dictionary<string, string> dictionary2 = new Dictionary<string, string>();
要求是從 中獲取所有值dictionary1 和不常見的值dictionary2,無論如何我已經實作了。
唯一的問題是,如果字典中的任何一個為 null,我就會遇到例外,我想處理這個 null 場景。如果任何字典為空,則回傳另一個字典。
var demo = dictionary1 .Concat(dictionary2 .Where(kvp => !dictionary1 .ContainsKey(kvp.Key))).ToList();
有人可以指導我如何做到這一點嗎?
uj5u.com熱心網友回復:
您可以null在查詢之前檢查字典是否為(并創建空的):
dictionary1 ??= new Dictionary<string, string>();
dictionary2 ??= new Dictionary<string, string>();
// no changes
var demo = dictionary1.Concat(dictionary2.Where(kvp => !dictionary1.ContainsKey(kvp.Key))).ToList();
uj5u.com熱心網友回復:
使用null而不是空集合通常是一種不好的做法,但是如果您必須使用null字典,您可以使用?.而不是僅僅使用.
// let's return empty list (not null) if any of dictionary is null
// if you want to have demo being null, remove ?? ... fragment
var demo = dictionary1
?.Concat(dictionary2
?.Where(kvp => dictionary1
?.ContainsKey(kvp.Key) == false))
?.ToList() ?? new List<KeyValuePair<string, string>>();
唯一的小困難是 with ?.ContainsKey(...):它回傳bool?而不是bool這就是為什么我們不能放置!但必須與falseor進行比較true。
uj5u.com熱心網友回復:
使用Concat不是一個好主意,因為字典的主要優點,即恒定的查找時間,會丟失!
請改用null-coalescing運算子:
if ((dictionary1 ?? dictionary2).TryGetValue(key, out string value)) {
...
}
如果兩個字典都可以null,則可以添加第三個詞:
dictionary1 ?? dictionary2 ?? new Dictionary<string, string>()
或創建一個空字典,您可以在這種情況下重復使用:
static readonly Dictionary<string, string> emptyDict = new();
...
if ((dictionary1 ?? dictionary2 ?? emptyDict).TryGetValue(key, out string value)) {
...
}
空合并運算子鏈 a ?? b ?? c ?? d回傳第一個非空值(如果有),否則回傳null。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/497416.html
上一篇:Linq將列組合分組為兩個串列
