[英]How to efficiently select a range in an observable collection into another observable collection
像(伪代码)的东西
ObservableCollection<TheClass> ob1 = new ObservableCollection<TheClass>();
ob1.Add(...);
ob1.Add(...);
ob1.Add(...);
ob1.Add(...);
ObservableCollection<TheClass> ob2;
ob2 = ob1.Range(0, 2);
考虑到两个集合都可以包含大量数据。
谢谢
ObservableCollection<TheClass> ob1 = new ObservableCollection<TheClass>();
ob1.Add(...);
ob1.Add(...);
ob1.Add(...);
ob1.Add(...);
ObservableCollection<TheClass> ob2;
// ob2 = ob1.Range(0, 2);
ob2 = new ObservableCollection(ob1.Skip(0).Take(2));
现在如果你真的坚持.Range
方法,你可以自己写一个扩展:
public static class ObservableCollectionExtensions
{
public static ObservableCollection<T> Range(this ObservableCollection<T> sequence, int start, int count)
{
return new ObservableCollection(sequence.Skip(start).Take(count));
}
}
现在你的代码应该编译:
ObservableCollection<TheClass> ob1 = new ObservableCollection<TheClass>();
ob1.Add(...);
ob1.Add(...);
ob1.Add(...);
ob1.Add(...);
ObservableCollection<TheClass> ob2;
ob2 = ob1.Range(0, 2);
ObservableCollection
不支持AddRange
方法。 您可以扩展的功能ObservableCollection
通过写一个扩展方法或通过创建从派生新类类ObservableCollection
类。 例如:
public class ObservableRangeCollection<T> : ObservableCollection<T>
{
public void AddRange(IEnumerable<T> collection)
{
var enumerable = collection as T[] ?? collection.ToArray();
foreach (var item in enumerable)
{
Items.Add(item);
}
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, enumerable.ToList()));
}
}
然后你可以为ob2
创建一个ObservableRangeCollection
实例而不是ObservableCollection
,并使用AddRange
并使用Skip
和Take
获取你喜欢的范围:
ObservableRangeCollection<TheClass> ob2 = new ObservableRangeCollection<TheClass>();
ob2.AddRange(ob1.Take(3));//Returns 3 number of contiguous elements from the start
// Or to grab a Range between 2 and 5
ob2.AddRange(ob1.Skip(2).Take(3))
使用此选项,您可以保留扩展方法。
public static ObservableCollection<T> Range<T>(this ObservableCollection<T> oc, uint startIndex, uint length) =>
oc.Skip(startIndex).Take(length);
并像这样使用它:
ob2 = ob1.Range(0, 2);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.