当索引不包含在另一个列表中时,按索引从列表中删除

本文关键字:列表 索引 删除 另一个 包含 | 更新日期: 2023-09-27 18:08:27

有没有办法让这段代码更有效率?

if (includeRows != null && includeRows.Count > 0)
{
    for (int i = aList.Count - 1; i >= 0; i--)
    {
        if (!includeRows.Exists(j => j == (i + 1)))
        {
            aList.RemoveAt(i);
            includeRows.Remove(i + 1);
        }
    }
}

这就是我所做的,列表中包含的对象不是整数,所以需要列表中对象的索引。不确定是否inclerows . remove()会使它更少或更有效,inclerows只是更改为HashSet。

for (int i = aList.Count - 1; i >= 0; i--) {
                    if (!includeRows.Contains(i + 1) )
                    {
                        aList.RemoveAt(i);
                       // includeRows.Remove(i + 1);
                    }
 }

当索引不包含在另一个列表中时,按索引从列表中删除

基于p.s.w.g的回答,我会:

HashSet<int> includeRowsFaster = new HashSet<int>(includeRows);
aList.RemoveAll(i => !includeRowsFaster.Contains(i + 1));

以获得最有效的性能和可读性。在inclerows中查找元素是一个复杂度为0 (n)的操作。您可以通过使用哈希集而不是向量(数组或列表)实现将其显著减少到O(log(n))。

关于Hashset和List性能的讨论:https://stackoverflow.com/a/10762995/390330

这里有一个使用Linq的Intersect方法的简单方法:

aList = aList.Intersect(includeRows).ToList();

但是为了获得更好的性能,您可以使用RemoveAll来代替

aList.RemoveAll(i => !includeRows.Exists(j => j == (i + 1));
aList = aList.Intersect(includeRows).ToList<int>();