繁体   English   中英

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

[英]How to check for object of particular type in a HashSet in windows 8?

我有一个通用类型UserControlHashSet ,它可以具有各种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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM