如何在windows 8中检查HashSet中特定类型的对象
本文关键字:类型 对象 HashSet 检查 windows | 更新日期: 2023-09-27 18:10:55
我有一个通用类型UserControl
的HashSet
,它可以有各种UserControl(登录,设置)。我想检查集合是否包含任何特定类型的对象(比如login)。如果是,我想要得到那个元素。
我知道用循环很容易做到,但是有没有更好的方法?
不幸的是,如果没有循环就不能这样做,因为需要尝试集合中的所有元素来检查它们的类型。事实上,你有一个哈希集并不重要:它对列表或任何其他可枚举对象都是一样的。但是,LINQ允许隐藏循环,如下所示:
var item = hashSet.OfType<DesiredType>().FirstOrDefault();
正如@dasblinkenlight所说,您可以使用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();
...
}