【问题标题】:Does C# have a ContainsAny() method for a dictionary?C# 是否有用于字典的 ContainsAny() 方法?
【发布时间】:2013-04-22 03:14:49
【问题描述】:

我有一个字典,其中键是一个 ID,值是一个字符串

我现在有一个人员对象列表,其中每个人都有一个 CarIds 属性,这是一个

IEnumerable<int>

我想基本上过滤对象列表以仅包含其中一个属性包含在字典中的项目。

例如。像这样:

var dictionary = GetDict();

var people = GetPeople();

 people = people.Where(r => dictionary.ContainsAny(r.CarIds)).ToList();

是否存在这样的事情,我可以做类似于 ContainsKey() 但检查 ints 列表中的任何事情?

【问题讨论】:

  • Pedantic:C# 甚至没有字典,更不用说像 ContainsAny 这样的方法了。 .NET 有字典,可能有这样的方法。

标签: c# linq collections


【解决方案1】:

是的,你可以试试这个列表:

people = people.Where(r => list.Intersect(r.CarIds).Count() != 0).ToList();

对于字典,你可以使用这个:

people = people.Where(r => r.CarIds.Any(n => dictionary.ContainsKey(n))).ToList();

【讨论】:

  • 谢谢。一个调整,因为它看起来像我需要 list.Keys.Intersect 给它一个字典
  • @leora 尝试更新,它应该比Intersect 运行得更快。
  • 我没有遵循您更新的答案,它似乎正在返回 bool 但您正在执行 != 0 检查。 .
【解决方案2】:

您最好的选择可能是扩展 Dictionary(可能应该有 ContainsAny()ContainsAnyKey())。

 public static bool ContainsAny<K, V>(
        this Dictionary<K, V> dict, IEnumerable<K> keys)
 {
     foreach(K key in keys)
         if(dict.ContainsKey(key)) return true;
     return false;
 }

这可以 linq'd 为:

    public static bool ContainsAny<K, V>(
           this Dictionary<K, V> dict, IEnumerable<K> keys)
    {  return keys.Any(key => dict.ContainsKey(key));  }

【讨论】:

    猜你喜欢
    • 2021-06-09
    • 2021-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多