我想从符合某些条件的列表中删除项目。我举了一个例子,到目前为止我想出了什么:
//remove 1´s and 3´s from list of ints
List<int> indexes = new List<int>();
List<int> ints = new List<int>();
ints.Add(1);
ints.Add(2);
ints.Add(3);
foreach (int i in ints)
{
if(i == 1 || i == 3)
indexes.Add(ints.IndexOf(i));
}
indexes.Reverse();
foreach (int index in indexes)
{
ints.RemoveAt(index);
}
我很好奇是否可以优化解决方案?我不能使用System.Linq,我只找到System.Data.Linq命名空间作为参考(Visual Studio 2005)
更新
我最好发布了我的真实代码。它是关于从gridview中删除列
List<int> indexes = new List<int>();
foreach (Type type in types)
{
foreach (DataControlField c in entriesGrid.Columns)
{
string header = c.HeaderText;
if (header == type.Name)
{
indexes.Add(entriesGrid.Columns.IndexOf(c));
}
}
}
答案 0 :(得分:4)
为什么不使用List<T>.RemoveAll()
?
ints.RemoveAll(IsOneOrThree); // Remove all 1's or 3's
private static bool IsOneOrThree(int i)
{
return i == 1 || i == 3;
}
如果不是那么简单(猜测它真的没有,你可以试试):
for(int i= ints.Count - 1; i >= 0; i--)
{
if(ints[i] == 1 || ints[i] == 3)
ints.RemoveAt(i);
}
这为您节省了另一个列表和多次迭代的成本。
答案 1 :(得分:0)
尝试RemoveAll:
public bool MyPredicate(int i){
return i == 3 || i == 5;
}
ints.RemoveAll(MyPredicate);
或者如果您有权访问匿名代表:
ints.RemoveAll( (i) => i == 3 || i == 5 );
此外,从SO中删除您的问题通常不是一个好主意,以便将来可能有相同问题的人可以阅读并从中学习。
答案 2 :(得分:0)
下面可以找到一个更精细的RemoveAll示例(指向.NET 2.0的链接):