Есть ли способ получить диапазон из ObservableCollection? - PullRequest
3 голосов
/ 05 ноября 2010

Я хотел бы получить диапазон из ObservableCollection с целью его циклического перемещения и изменения свойства этих элементов.Есть ли простой встроенный способ сделать это с помощью класса ObservableCollection?

Ответы [ 4 ]

6 голосов
/ 05 ноября 2010

Вы можете использовать Skip и Take.

System.Collections.ObjectModel.ObservableCollection<int> coll = 
    new System.Collections.ObjectModel.ObservableCollection<int>()
        { 1, 2, 3, 4, 5 };
foreach (var i in coll.Skip(2).Take(2))
{
    Console.WriteLine(i);
}
3 голосов
/ 05 ноября 2010

Для циклов ObservableCollection<T> происходит от Collection<T> и реализует IList<T>.Это позволяет выполнять цикл по индексу:

for (int i=5;i<10;++i)
{
     DoSomething(observableCollection[i]);
}

Если вы хотите выполнять запросы к коллекции через LINQ, у вас есть несколько вариантов.Вы можете использовать Skip () и Take () или создать новый диапазон и получить доступ по индексу:

var range = Enumerable.Range(5, 5);
var results = range.Select(i => DoMappingOperation(observableCollection[i]));

Или:

var results = observableCollection.Skip(5).Take(5).Select(c => DoMappingOperation(c));
1 голос
/ 05 ноября 2010
foreach(var item in MyObservableProperty.Skip(10).Take(20))
{
  item.Value = "Second ten";
}

Пропустить и Take - это методы расширения linq, используемые для разбивки на страницы в коллекции.

1 голос
/ 05 ноября 2010

ObservableCollection<T> реализует Colletion<T>, который реализует IEnumerable, поэтому вы должны иметь возможность сделать (если вы ищете диапазон, который соответствует заданным критериям):

foreach(var item in observerableCollection.Where(i => i.prop == someVal))
{
    item.PropertyToChange = newValue;
}

Или произвольныйдиапазон (в данном случае это пункты 10 - 40):

foreach(var item in observableCollection.Skip(10).Take(30))
{
    item.PropertyToChange = newValue;
}
...