[英]How to check for object of particular type in a HashSet in windows 8?
我有一个通用类型UserControl
的HashSet
,它可以具有各种UserControl(登录,设置)。 我想检查集合是否包含任何特定类型的对象(例如登录名)。 如果是这样,我想获得该元素。
我知道使用循环很容易,但是还有更好的方法吗?
不幸的是,您不能无循环地执行此操作,因为您需要尝试收集中的所有元素以检查其类型。 实际上,设置哈希集并不重要:它与列表或任何其他可枚举的名称相同。 但是,LINQ允许您隐藏循环,如下所示:
var item = hashSet.OfType<DesiredType>().FirstOrDefault();
正如@dasblinkenlight所说,您可以使用OfType OfType<T>()
LINQ方法隐藏循环。 他的答案还使用FirstOrDefault()
方法,因此“包含元素?” 问题改写为“不为空”。 另一种方法是在OfType<T>()
之后使用Count() > 0
。
var items = hashSet.OfType<DesiredType>();
if (items.Count() > 0) {
DesiredType item = items.First();
...
}
第三种方法是将谓词放在FirstOrDefault()
方法中。
var item = hashSet.FirstOrDefault(x =>
x.getType() == typeof(DesiredType)
);
if (item != null) {
...
}
如果您的集合不经常更改,则可以使用GroupBy(func)
将计算复杂度降低到O(1) 。 想法是只建立一次字典,然后查询它。
var groups = new Dictionary<Type, IEnumerable<UserControl>>();
foreach(var group in hashSet.GroupBy(x => x.GetType()))
groups.Add(group.Key, group);
.
.
.
if (groups.ContainsKey(typeof(DesiredType)) {
DesiredType item = items.First();
...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.