2010-10-19 5 views
3

Это моя установкаC#/LINQ: Пытаясь оптимизировать производительность

class EditorTabViewModel : TabViewModel { 
    ... 
    public bool CanSave { get; set; }; 
} 

ObservableCollection<TabViewModel> _tabs 

Я хочу, чтобы проверить, есть ли какие-то вкладки в _tabs, которые EditorTabViewModel, что имеет свойство CanSave набор для истинного

я сделал что-то как ...

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; 

Интересно, есть ли лучший способ сделать это? возможно, мне не нужно будет извлекать все вкладки, или, может быть, мне просто нужно запросить счет или что-то еще?

ответ

11

Как насчет:

return _tabs.OfType<EditorTabViewModel>().Any(t => t.CanSave); 

Здесь:

  • OfType<> не является буферизация фильтр, который ограничивает нас до EditorTabViewModel
  • Any короткое замыкание, поэтому возвращает истину, как только совпадение найдено
+1

+1 для лучшего ответа, чем я ... потому что я думаю, это работает :). –

+0

wow, короткий и простой, мне нравится –

1

Использование расширений LinQ вы могли бы написать что-то вроде

_tabs.Any(p => p is EditorTabViewModel && ((EditorTabViewModel)t).CanSave)

1

Попробуйте что-то вроде:

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

'SingleOrDefault' должен все еще потреблять всю последовательность, чтобы не было * двух * совпадений. В самом деле, это будет иметь другой исход (исключение) для исходного кода (который вернет true), если есть несколько вкладок, которые можно сохранить. –

+1

@Marc: Я хотел использовать «FirstOrDefault», конечно :). –

2

Да, вы можете улучшить. Возможно, что-то вроде этого будет работать:

return _tabs.Any(x => x is EditorTabViewModel && ((EditorTabViewModel)x).CanSave); 
+0

Ха-ха, много дубликатов :) – Onkelborg

Смежные вопросы