2014-09-09 4 views
0

Я пытаюсь найти опрятный способ найти все значения в наблюдаемой коллекции, которые отвечают определенным критериям. Для этого примера, чтобы держать вещи просто позволяю сказать, что сва коллекция содержит Интс, и я пытаюсь найти все элементы, которые больше 5.Как вернуть все элементы в ObservableCollection, которые удовлетворяют условию C#

Лучшего способ я в настоящее время знаю, делать это, как это

ObservableCollection<Int> findAllGreaterThanFive (ObservableCollection<Int> numbers) 
{ 
    ObservableCollection<Int> numbersGreaterThanFive; 

    foreach(Int number in numbers) 
    { 
     if (number > 5) 
     { 
      numbersGreaterThanFive.add(number);  
     } 
    } 

    return numbersGreaterThanFive; 
} 

Очевидно, игнорировать любые простые решения, которые используют преимущества того, что я ищу ints Мне нужно решение, которое работает с любым ObservableCollection любого типа с любым условием. Мне просто интересно, проверяет ли каждый элемент цикл foreach, а условный - лучший способ сделать это?

+0

Почему вы возвращаете новую коллекцию? –

+0

Пошлите фильтр как 2-й параметр вашего метода. В этом случае используйте Func . –

+0

Я бы сказал, используя LINQ. Отложенное исполнение - ваш друг, в этом случае. –

ответ

5

вы можете использовать System.Linq пространство имен, добавьте используя заявление using System.Linq и после этого вы можете использовать следующие Where метода.

ObservableCollection<int> list = mew ObservableCollection<int>(); 
list.Where(i => i > 5).ToList(); 

вы можете использовать любые объекты, как:

ObservableCollection<DataItem> list = new ObservableCollection<DataItem>(); 
list.Where(i => i.ID > 10); 

Приведенный выше код возвращает DataItem с ID больше 10.

Если вы уверены, есть только одна запись, удовлетворяющую условию, вы можете использование First() метод:

ObservableCollection<DataItem> list = new ObservableCollection<DataItem>(); 
list.First(i => i.ID == 10); 

Выше кода возвращает Дат aItem с идентификатором 10. Но если нет записи с идентификатором = 10, то это вызовет исключение. Избегайте этого, если вы не уверены, что только одна запись удовлетворяет условию. Также вы можете использовать метод FirstOrDefault().

ObservableCollection<DataItem> list = new ObservableCollection<DataItem>(); 
    DataItem item = list.FirstOrDefault(i => i.ID == 10); 
if(item != null) 
{ 
//DoWork 
} 

Если нет записи с идентификатором = 10, тогда элемент будет пустым.

8

Вы можете сказать что-то вроде:

var numbersGreaterThanFive = numbers.Where(x => x > 5); 
+2

был буквально набрал это !!! : P – jbutler483

+1

Чтобы расширить это, вы можете использовать IComparable вместо «>» и переменную вместо «5» для удовлетворения последней части вопроса. –

+2

особенно, 'return new ObservableCollection (numbers.Where (x => x> 5))'. – 2014-09-09 12:10:00