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

时间:2016-01-02 10:34:07

标签: c# wpf range observablecollection

像(伪代码)

之类的东西
ObservableCollection<TheClass> ob1 = new ObservableCollection<TheClass>();
ob1.Add(...);
ob1.Add(...); 
ob1.Add(...);
ob1.Add(...); 
ObservableCollection<TheClass> ob2;
ob2 = ob1.Range(0, 2);

考虑到两个集合都可以包含大量数据。

感谢

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分: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()));
    }
}

然后,您可以为ObservableRangeCollection创建ObservableCollection而不是ob2的实例,并使用AddRange并使用Skip和{{获取您最喜欢的范围1}}像这样:

Take

答案 2 :(得分:1)

使用此项,您可以保留扩展方法。

public static ObservableCollection<T> Range<T>(this ObservableCollection<T> oc, uint startIndex, uint length) => 
    oc.Skip(startIndex).Take(length);

并像这样使用它:

ob2 = ob1.Range(0, 2);