当索引不包含在另一个列表中时,按索引从列表中删除
本文关键字:列表 索引 删除 另一个 包含 | 更新日期: 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>();