【问题标题】:Check if a dictionary is present in a list of dictionary?检查字典列表中是否存在字典?
【发布时间】:2016-03-07 13:17:35
【问题描述】:

如何检查字典列表是否包含特定字典?

private List<Dictionary<string, object>> detailsDictionary;
private Dictionary<string, object> selecteItem;   

有没有直接的方法来检查selectedItem 是否在detailsDictionary 中?

答案:

bool isPresent=false;
foreach(Dictionary<string,object> dic in detailsDictionary)
                    {
                        if (DictionaryExtensionMethods.ContentEquals(selectedItem, dic))
                        {
                            isPresent= true;
                            break;
                        }
                    }


public static class DictionaryExtensionMethods
{
    public static bool ContentEquals<TKey, TValue>(this Dictionary<TKey, TValue> dictionary, Dictionary<TKey, TValue> otherDictionary)
    {
        return (otherDictionary ?? new Dictionary<TKey, TValue>())
            .OrderBy(kvp => kvp.Key)
            .SequenceEqual((dictionary ?? new Dictionary<TKey, TValue>())
                               .OrderBy(kvp => kvp.Key));
    }
}

我手动将列表中的每个字典与所选字典进行比较,如果两个字典相等,则设置 isPresent=true。我认为这是一个漫长的过程,应该有其他简单的方法。

【问题讨论】:

  • 您可以使用 Contains 假设您进行参考搜索而不是搜索具有相同键和值的字典。
  • 如果字典包含相同的键但具有不同的值会发生什么?
  • 如果您正在考虑比较字典是否相等,那么您正在寻求错误的解决方案。请不要问 XY 问题。
  • 我不想比较我想知道只是天气一个字典对象列表是否包含字典?并且在检查字典的键和值时应该完全匹配。

标签: c# list dictionary


【解决方案1】:

您可以使用IList.Contains 方法检查列表中是否有任何项目:

bool contains = detailsDictionary.Contains(selectedItem);

请注意,这具有 O(N) 复杂性,因为它必须遍历列表中的每个项目,直到找到匹配项或遍历整个列表。如果这是一个问题,您可能希望使用HashSet 缓存您的列表,它有一个Contains 方法,(在大多数情况下) 工作得更快。

【讨论】:

  • 感谢朋友的回复。但即使 detailsDictionary 包含 selectedItem 值表达式“detailsDictionary.Contains(selectedItem);”,上面的代码也不起作用返回错误
  • @Joee 它是否包含相同的列表包含相同项目的列表?这是两个不同的东西。
  • 我不知道您问题的确切答案,但我需要的是我有字典列表(例如:List> detailsDictionary),它包含一个具有相同键的字典,值并计为 (ex:Dictionary selecteItem) 这个字典。我想查找天气“selectedItem”字典在“detailsDictionary”中
【解决方案2】:

或者,如果您的意思是 selectedItemdetailsDictionary 的元素共享相同的键,而不是它们是相同的对象:

detailsDictionary.Any(dict => dict.Count == selectedItem.Count && dict.Keys.All(key => selectedItem.ContainsKey(key)));

显然这比较慢,就像 Gediminas 提到的那样,如果速度至关重要,可能会有更好的方法。

【讨论】:

  • 感谢重播。我检查了上面的代码,它没有返回 bool 值,而是返回数字 282
【解决方案3】:

我在代码中使用的解决方案检查selectedItem 的值是否存在于每个detailsDictionary 项目中,

detailsDictionary.Any(x=> x.Values.SequenceEqual(selectedItem.Values));

这假设字典列表都是相同类型的字典(相同的标题)。 如果没有,您可以执行以下操作:

detailsDictionary.Any(x=> x.Values.SequenceEqual(selectedItem.Values) &&
                          x.Keys.SequenceEqual(selectedItem.Values));

但是我不太了解这种方法的效率。

【讨论】:

    猜你喜欢
    • 2017-09-28
    • 2018-04-10
    • 2019-02-13
    • 1970-01-01
    • 2011-04-23
    • 2012-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多