繁体   English   中英

如何有效地将可观察集合中的范围选择到另一个可观察集合中

[英]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并使用SkipTake获取你喜欢的范围:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM