检查字典是否包含具有特定属性的任何键对象

时间:2018-10-04 10:39:21

标签: c# dictionary

我想知道这是否可以在C#中完成。我有一个Dictionary<User, Device>(),其中的键和值是:

public Device {
    public string Id; 
}

public User {
    public string Name;
}

我想知道我的词典中是否包含User属性等于Name的任何"John"键。想象有类似的东西:

myDictionary.ContainsKey(key => key.Name == "John");

这可能吗?

2 个答案:

答案 0 :(得分:2)

通过两种修改(即选择一种适合您的需求),您可以做到:

  1. 您可以在.dropdown-title { position: relative; display: inline-block; &:hover .dropdown-content { display: block; } .dropbtn { background-color: transparent; border: none; } .dropdown-content { display: none; position: absolute; background-color: white; min-width: 2em; z-index: 1; a { color: black; padding: 12px 16px; text-decoration: none; display: block; &:hover { background-color: #ced6e0; } } } } 上覆盖GetHashCodeEquals,以使两个不同的User实例等于(如果它们具有相同的{{1} }值
  2. 您可以为字典提供一个User实例,该实例的作用与第1点相同,除了在Name之外进行比较之外

选项1:覆盖GetHashCode和等于

通过此IEqualityComparer<User>实现:

User

您可以通过以下方式查询此类用户:

User

DotNetFiddle example

选项2:实现IEqualityComparer

使用此类:

public class User
{
    public string Name;

    public override int GetHashCode() => Name?.GetHashCode() ?? 0;
    public override bool Equals(object other) => (other as User)?.Name == Name;
}

(并且myDictionary.ContainsKey(new User { Name = "John" }); 不变,请保持在您的问题中)

您可以像这样构建字典:

public class UserEqualityComparer : IEqualityComparer<User>
{
    public bool Equals(User x, User y) => x?.Name == y?.Name;
    public int GetHashCode(User obj) => obj?.Name?.GetHashCode() ?? 0;
}

然后再次可以像这样查询它:

User

DotNetFiddle example


如果这两个都不是选项,则您将具有线性搜索,其性能将类似于var myDictionary = new Dictionary<User, Device>(new UserEqualityComparer()); 的集合,这恰好就是它的样子,并且可能没有您想要的性能特征

答案 1 :(得分:0)

Dictionary<TKey, TValue>“是” IEnumerable<KeyValuePair<TKey, TValue>>,这意味着您可以做到:

myDictionary.Any(kvp => kvp.Key.Name == "John");

那将是一个O(n)操作。

如果您关心哈希图的性能(是否使用字典?),则可以覆盖GetHashCode()类的User和相等性,因此new User { Name = "John" }.Equals(new User { Name = "John" })为真,允许:< / p>

myDictionary.ContainsKey(new User { Name = "John" });

是O(1)