C#/LINQ:尝试优化性能

3
这是我的设置。
class EditorTabViewModel : TabViewModel {
    ...
    public bool CanSave { get; set; };
}

ObservableCollection<TabViewModel> _tabs

我想检查是否有任何在_tabs中的选项卡是EditorTabViewModel,并且具有将CanSave属性设置为true的功能。
我做了类似以下的事情...
var tabs = from t in _tabs
            where t is EditorTabViewModel
            && ((EditorTabViewModel)t).CanSave == true
            select t;
if (tabs.Count() > 0)
    return true;
else
    return false;

我在想是否有更好的方法来做这件事?也许我不需要检索所有标签,或者我只需要查询数量或其他什么东西?

4个回答

11
如何呢:
return _tabs.OfType<EditorTabViewModel>().Any(t => t.CanSave);

这里:

  • OfType<>是一种非缓冲过滤器,限制我们只能使用 EditorTabViewModel
  • Any 是短路的,所以只要找到一个匹配项就会返回true

2
是的,您可以提高。类似于这样的方法可能会起到一定作用:
return _tabs.Any(x => x is EditorTabViewModel && ((EditorTabViewModel)x).CanSave);

1
使用linq扩展,你可以写成这样的代码:
```csharp _tabs.Any(p => p is EditorTabViewModel && ((EditorTabViewModel)p).CanSave) ```

1

尝试类似这样的内容:

return _tabs.FirstOrDefault(y => y is EditorTabViewModel && ((EditorViewModel)t).CanSave) != null;

1
SingleOrDefault 仍然需要消耗整个序列,以确保没有两个匹配项。当有多个可以保存的选项卡时,这将产生与原始代码(返回 true)不同的结果(异常)。 - Marc Gravell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接