【问题标题】:Determine if Dictionary has entries that exist in List确定 Dictionary 是否具有 List 中存在的条目
【发布时间】:2016-06-23 23:22:33
【问题描述】:

我猜这个问题的答案很简单,但我一直无法弄清楚。

我正在尝试将List 中的条目添加到Dictionary 中(在其他情况下,我只是检查List 中是否存在任何List 条目。

private Dictionary<string, long> someDict;
public List<string> someList;

//someDict might have entries added here, someList is populated here

//Check if someDict currently has ANY entries from someList
if(someDict.ContainsKey(someList.RETURNALL)
{ 
    //may or may not add entries here depending on other conditions
    if(someOtherCondition){
       //Add any or all entries from someList into someDict using timestamp as second-column entry for someDict
    }
}

显然RETURNALL 不是一个实际的方法,这就是我卡住的地方。我知道我可以使用Union 加入Lists,并希望我能在这里做些什么。

感谢任何帮助!谢谢!

【问题讨论】:

    标签: c# list dictionary


    【解决方案1】:

    如果您正在寻找纯 LINQ 解决方案:

    if (someList.Any(someDict.ContainsKey)) {
      ...
    }
    

    这还有一个好处是可以有效地使用字典的内部哈希表,一旦找到一个匹配项就会停止迭代列表。

    【讨论】:

    • 我想这就是我想要的!我是倒着想的(List 是参数)
    • 你可以使用someDict.Keys.Any(someList.Contains),但这并不能有效地使用字典哈希表。
    【解决方案2】:

    所以你想检查所有这些? 我认为您必须遍历每个并找出类似的内容:

    foreach(var i in someList)
    {
    if(someDict.ContainsKey(i)
    { 
        //may or may not add entries here depending on other conditions
        if(someOtherCondition){
           //Add any or all entries from someList into someDict using timestamp as second-column entry for someDict
        }
    }
    }
    

    【讨论】:

    • 是的,我希望避免使用任何循环,但这可能是我必须做的。希望有更有效的方法来做到这一点。谢谢:)
    • 实际上,循环是这里的轻足迹,它不会影响太大,检查是否存在是需要时间的,但感谢 Dictionary.ContainsKey 的复杂性约为O(1)
    【解决方案3】:

    这可能不是最有效的方法,但显然您可以为此编写自己的函数:

    private bool ContainsAny(Dictionary<string, long> someDict, List<string> someList) {
     foreach(string listItem in someList) {
      if (someDict.containsKey(listItem)) {
       return true;
      }
     }
     return false;
    }
    

    这应该只是检查给定字典是否包含给定列表中的任何值。

    【讨论】:

    • 由于我要在代码中的任何地方运行这些检查,我将不得不考虑编写自己的函数。这就是为什么我要问我最初的问题;希望框架中已经存在一个内置功能:)
    【解决方案4】:

    如果需要检查 someDict 中的值。

    long tmp;
    foreach(var i in someList)
    {
      if(someDict.TryGetValue(i, out tmp))
      { 
        //may or may not add entries here depending on other conditions
        if(someOtherCondition(tmp)){
           //Add any or all entries from someList into someDict using timestamp as second-column entry for someDict
        }
       }
    }
    

    【讨论】:

      【解决方案5】:
            private Dictionary<string, long> someDict;
            public List<string> someList;
      
              foreach (string t in someList.Where(t => someDict.ContainsKey(t)))
              {
                    if(someOtherCondition){ }
      
              }
      

      【讨论】:

        【解决方案6】:

        采用 nhouser9 的想法,但通过使用模板化的extension method 进行概括。

        public static class DictionaryExtension
        {
            public static bool ContainsAny<K, V>(this Dictionary<K, V> someDict, IEnumerable<K> someList)
            {
                foreach(K listItem in someList)
                {
                    if(someDict.ContainsKey(listItem))
                    {
                        return true;
                    }
                }
                return false;
            }
        }
        

        那你就可以写了

        if(someDict.ContainsAny(someList))
        

        甚至

        if(someDict.ContainsAny(new string[] {"a","b"}))
        

        【讨论】:

          猜你喜欢
          • 2011-03-28
          • 2013-05-15
          • 1970-01-01
          • 1970-01-01
          • 2013-01-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多