簡體   English   中英

當值是C#中的對象列表時,如何查找字典的鍵?

[英]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版本將是...。

  1. List.Contains

     List<string> keysWithValue = dict .Where(kv => kv.Value.Contains(foo)) .Select(kv => kv.Key); .ToList(); 
  2. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM