我想知道这是否可以在C#中完成。我有一个Dictionary<User, Device>()
,其中的键和值是:
public Device {
public string Id;
}
public User {
public string Name;
}
我想知道我的词典中是否包含User
属性等于Name
的任何"John"
键。想象有类似的东西:
myDictionary.ContainsKey(key => key.Name == "John");
这可能吗?
答案 0 :(得分:2)
通过两种修改(即选择一种适合您的需求),您可以做到:
.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;
}
}
}
}
上覆盖GetHashCode
和Equals
,以使两个不同的User
实例等于(如果它们具有相同的{{1} }值User
实例,该实例的作用与第1点相同,除了在Name
之外进行比较之外通过此IEqualityComparer<User>
实现:
User
您可以通过以下方式查询此类用户:
User
使用此类:
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
如果这两个都不是选项,则您将具有线性搜索,其性能将类似于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)