1

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

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

4

2 回答 2

2

不幸的是,没有循环就无法做到这一点,因为您需要尝试集合中的所有元素来检查它们的类型。事实上,你有一个散列集并不重要:它与列表或任何其他可枚举的工作相同。但是,LINQ 允许您隐藏循环,如下所示:

var item = hashSet.OfType<DesiredType>().FirstOrDefault();
于 2013-04-25T11:11:38.817 回答
0

正如@dasblinkenlight 所说,您可以使用OfType<T>()LINQ 方法来隐藏循环。他的回答也使用FirstOrDefault()了“包含元素?”的方法。问题被改写为“不为空”。另一种方法是使用Count() > 0after 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();
    ...
}
于 2013-04-25T13:21:54.427 回答