有没有办法从ObservableCollection获得范围?

时间:2010-11-05 15:25:44

标签: c# wpf observablecollection

我想从ObservableCollection获取一个范围,以便循环遍历它并更改这些项的属性。使用ObservableCollection类有一个简单的内置方法吗?

4 个答案:

答案 0 :(得分:6)

您可以使用SkipTake

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);
}

答案 1 :(得分:3)

对于循环,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));

答案 2 :(得分:1)

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;
}

答案 3 :(得分:1)

foreach(var item in MyObservableProperty.Skip(10).Take(20))
{
  item.Value = "Second ten";
}

SkipTake是用于分页集合的linq扩展方法。