0

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

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);
        }
    }
}

这就是我所做的,aList 包含对象而不是整数,因此需要列表中对象的索引。不确定 includeRows.Remove() 是否会降低或提高效率,includeRows 刚刚更改为 HashSet。

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

3 回答 3

3

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

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

但是为了获得更好的性能,您可以RemoveAll改用

aList.RemoveAll(i => !includeRows.Exists(j => j == (i + 1));
于 2013-04-10T05:33:00.393 回答
3

基于 pswg 的回答,我会这样做:

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

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

有关 Hashset 与 List 性能的讨论,请参阅此内容:https ://stackoverflow.com/a/10762995/390330

于 2013-04-10T05:33:22.087 回答
0
aList = aList.Intersect(includeRows).ToList<int>();
于 2013-04-10T05:34:01.863 回答