2013-04-10 105 views
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包含对象不是整数,因此所需要的对象的指数在list.Not知道如果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); 
        } 
} 
+0

让你有索引的列表,你想从另一个列表中删除未包含在索引中的项目? – Nahum 2013-04-10 05:18:31

+0

是----------- – tsukimi 2013-04-10 05:25:52

回答

3

大楼,我会做:

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

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

为与名单上的表现的Hashset讨论,请参阅本:https://stackoverflow.com/a/10762995/390330

+0

+1是的,这样会更高效,更具可读性 – 2013-04-10 06:08:53

+0

这里的哈希集获得额外的性能。 – tsukimi 2013-04-10 06:12:20

3

下面是使用LINQ的Intersect方法的简单方法:

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

但有更好的表现,你可以在PSWG的答案使用RemoveAll代替

aList.RemoveAll(i => !includeRows.Exists(j => j == (i + 1)); 
+0

+1为可读解决方案 – basarat 2013-04-10 06:10:34

+0

谢谢你的好回答。相交是一个好主意,没有想到这一点,但会坚持使用RemoveAll。 – tsukimi 2013-04-10 06:11:41

0
aList = aList.Intersect(includeRows).ToList<int>();