[英]How to find the key of a dictionary when the value is a list of objects in C#?
當我有一個對象列表作為值時,我想找到相應的鍵。 假設我有一本字典,
Dictionary<string, List<object>> dict = new Dictionary<string, List<object>>();
我知道我可以做些類似的事情,
foreach (var item in dict)
{
foreach (var subItem in item.Value)
{
if (subItem.Equals(foo))
{
Console.WriteLine(item.Key);
}
}
}
但這需要花費大量時間,我擁有大量的數據集。 有更快的解決方案嗎?
我知道使用LINQ查找給定值的鍵的正常方法是這樣的:
var keysWithMatchingValues = dict.Where(p => p.Value == myObject).Select(p => p.Key);
我正在尋找適合自己情況的類似解決方案。
LINQ在大多數情況下並不是性能更高,但是使用LINQ編寫正確且可讀的代碼通常更容易。 如果沒有可能的重復值,我將使用HashSet<T>
而不是列表。 如果您知道它是什么類型,我將使用該類型而不是對象。
您的代碼的LINQ版本將是...。
與List.Contains
:
List<string> keysWithValue = dict .Where(kv => kv.Value.Contains(foo)) .Select(kv => kv.Key); .ToList();
或Enumerable.Any
:
List<string> keysWithValue = dict .Where(kv => kv.Value.Any(v => foo.Equals(v))) .Select(kv => kv.Key); .ToList();
但是如前所述,這不會更有效。 一種提高性能的方法是使用Lookup<TKey, TValue>
。 如果字典沒有變化,則只需創建一次即可:
var valueToKeyLookup = dict // make it an instance field, so that you don't have to create it always
.SelectMany(kv => kv.Value
.Distinct()
.Select(v => new {Key = kv.Key, Value = v})
)
.ToLookup(x => x.Value, x => x.Key);
現在剩下的代碼非常簡潔高效:
List<string> allKeysWithFoo = valueToKeyLookup[foo].ToList();
請注意,即使沒有列表包含該值,這也將起作用,那么結果將是一個空列表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.