我有一个HashSet
通用类型UserControl
,它可以有各种 UserControl(登录、设置)。我想检查该集合是否包含任何特定类型的对象(例如登录)。如果是这样,我想得到那个元素。
我知道用循环很容易做到,但是有没有更好的方法?
不幸的是,没有循环就无法做到这一点,因为您需要尝试集合中的所有元素来检查它们的类型。事实上,你有一个散列集并不重要:它与列表或任何其他可枚举的工作相同。但是,LINQ 允许您隐藏循环,如下所示:
var item = hashSet.OfType<DesiredType>().FirstOrDefault();
正如@dasblinkenlight 所说,您可以使用OfType<T>()
LINQ 方法来隐藏循环。他的回答也使用FirstOrDefault()
了“包含元素?”的方法。问题被改写为“不为空”。另一种方法是使用Count() > 0
after OfType<T>()
。
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();
...
}