我有List<object> fullList
和List<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);
}
答案 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);