对原始集合执行过滤和排序

本文关键字:排序 过滤 执行 原始 集合 | 更新日期: 2023-09-27 18:13:46

我已经陷入了一个场景,我有一个自定义集合类继承形式ICollection接口,我有一个代码段如下:

myCustomCollectionObject.Where(obj=>obj.isValid).ToList().Sort(mycustomerComparer);
上面的

代码过滤原始集合,然后对集合进行排序现在,在这种情况下,排序将在不同的集合上执行,而不是在原始集合上执行。

那么,是否有任何方法或解决方法来实现首先过滤然后对原始集合进行排序

对原始集合执行过滤和排序

如果你不能使用Linq的不可变/函数性优点,那么你必须使用老式的方法:

//Remove unwanted items
for (int i = myCustomCollectionObject.Length; i >= 0 ; i--)
{
    if(!myCustomCollectionObject[i].IsValid)
        myCustomCollectionObject.Remove(myCustomCollectionObject[i]);
}
myCustomCollectionObject.Sort(mycustomerComparer);

刚好知道myCustomCollectionObject不是List<T>,因此完全重写。


方法1:

在你的类中有一个Sort方法

List<T> backingStructure; //assuming this is what you have.
public void Sort(IComparer<T> comparer)
{
    backingStructure = backingStructure.Where(obj => obj.isValid).ToList();
    backingStructure.Sort(comparer);
}

,在内部后备结构上调用Sort。我认为它必须是List<T>Array,两者都有Sort。我已经添加了过滤逻辑内部你的Sort方法。

方法2:

如果你不希望这样,即你希望你的过滤逻辑是外部的类,然后有一个方法从IEnumerable<T>重新填充你的支持结构。如:

List<T> backingStructure; //assuming this is what you have.
//return type chosen to make method name meaningful, up to you to have void
public UndoRedoObservableCollection<T> From(IEnumerable<T> list)
{
    backingStructure.Clear();
    foreach(var item in list)
        //populate and return;
}

把它命名为

myCustomCollectionObject = myCustomCollectionObject.From
                           (
                               myCustomCollectionObject.Where(obj => obj.isValid)
                                                       .OrderBy(x => x.Key)
                           );

但是你需要一个键来指定排序。

方法3(最好的方法):

有一个RemoveInvalid方法

List<T> backingStructure; //assuming this is what you have.
public void RemoveInvalid()
{
    //you can go for non-Linq (for loop) removal approach as well.
    backingStructure = backingStructure.Where(obj => obj.isValid).ToList();
}
public void Sort(IComparer<T> comparer)
{
    backingStructure.Sort(comparer);
}

称之为:

myCustomCollectionObject.RemoveInvalid();    
myCustomCollectionObject.Sort(mycustomerComparer);