根据完整列表排序过滤的对象列表

时间:2017-09-12 22:27:06

标签: c# list sorting

我有List<object> fullListList<object> filteredList(仅包含不同的项目,filteredList中的所有项目都可以在fullList中找到 - 但反之亦然)< / p>

现在有时在我的程序中,我正在调用filteredList.Add(fullList[#]);,并且已经意识到我希望filteredList中存在fullList中的相同顺序。这样做的最佳方式是什么?

这是我想到的一个解决方案(但我想知道是否有更好的方法):

public void AddToFilteredList(object input)
{
    int index = 0;
    foreach (object ob in fullList)
    {
        if (filteredList.Contains(ob))
        {
            if (fullList.IndexOf(input) > fullList.IndexOf(ob))
                index++;
            else
            {
                filteredList.Insert(index, input);
                return;
            }
        }   
    }

    filteredList.Add(input);
}

3 个答案:

答案 0 :(得分:1)

  

import csv import numpy as np with open('filename','rb') as csvfile: cdl = list( csv.reader(csvfile,delimiter='\t')) print "Number of records = " + str(len(cdl)) #then later npcdl = np.array(cdl) 可能会随着时间而改变。它可以重新加载或排序   不同。显然,在每种情况下,fullList   必须修改

如果filteredList可以随时间改变其顺序,那么我建议您以稍微不同的方式思考问题。你不需要一个排序列表&#39; as&#39;我的原始列表,但删除了一些项目&#39;。

我建议宣布:

fullList

向其中添加条目,而不是向HashSet<object> subsetOfFullList 添加条目。

然后,当您需要filteredList时,使用filteredList(即将保持顺序)生成它(动态)。类似的东西:

Where

答案 1 :(得分:1)

我会创建一个包装类,并保持两个列表同步为@ L.B评论。这样,添加的复杂性从O(n)减少到O(log n)

public class MyList<T>
{
    List<T> _FullList = new List<T>();
    List<T> _FilteredList = new List<T>();

    public void Add(T item)
    {
        Insert(_FullList, item);
        if(somecondition)
            Insert(_FilteredList, item);
    }

    public void Remove(T item)
    {
        _FullList.Remove(item);
        _FilteredList.Remove(item);
    }

    void Insert(List<T> list, T item)
    {
        var index = list.BinarySearch(item);
        if (index < 0) index = ~index;
        list.Insert(index, item);
    }

    //other methods needed 
}

答案 2 :(得分:-1)

您可以使用SortedList filteredList作为fullList中索引的关键字:

var fullListWithIndex = fullList.Select((f,i) => new { f, i });

然后,您可以过滤fullListWithIndex以保留索引:

var filteredList = new SortedList<int, typeoff>();

foreach (var fi in fullListWithIndex.Where(fi => test(fi.f)))
    filteredList.Add(fi.i, fi.f);

然后,您可以将新项目添加到正确位置的filteredList

filteredList.Add(num, fullList[num]);

您可以使用filteredList.Values之前使用filteredList的地方。

如果你喜欢扩展方法,ToSortedList可以很好:

public static SortedList<TKey, TValue> ToSortedList<TObj, TKey, TValue>(this IEnumerable<TObj> src, Func<TObj, TKey> keySelector, Func<TObj, TValue> valueSelector) {
    var ans = new SortedList<TKey, TValue>();

    foreach (var srcObj in src)
        ans.Add(keySelector(srcObj), valueSelector(srcObj));

    return ans;
}

public static SortedList<TObj, TObj> ToSortedList<TObj>(this IEnumerable<TObj> src) => ToSortedList(src, x => x, x => x);
public static SortedList<TKey, TObj> ToSortedList<TKey, TObj>(this IEnumerable<TObj> src, Func<TObj, TKey> keySelector) => ToSortedList(src, keySelector, x => x);

现在你有了

var filteredList = fullListWithIndex.Where(fi => test(fi.f).ToSortedList(fi => fi.i, fi => fi.f);
相关问题