如何在windows 8中检查HashSet中特定类型的对象

本文关键字:类型 对象 HashSet 检查 windows | 更新日期: 2023-09-27 18:10:55

我有一个通用类型UserControlHashSet,它可以有各种UserControl(登录,设置)。我想检查集合是否包含任何特定类型的对象(比如login)。如果是,我想要得到那个元素。

我知道用循环很容易做到,但是有没有更好的方法?

如何在windows 8中检查HashSet中特定类型的对象

不幸的是,如果没有循环就不能这样做,因为需要尝试集合中的所有元素来检查它们的类型。事实上,你有一个哈希集并不重要:它对列表或任何其他可枚举对象都是一样的。但是,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();
    ...
}