【问题标题】:Remove items from list (.net 2.0)从列表中删除项目 (.net 2.0)
【发布时间】:2012-01-11 15:10:13
【问题描述】:

我想从满足特定条件的列表中删除项目。我举了一个到目前为止我想出的例子:

//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)

更新

我最好发布我的真实代码。这是关于从网格视图中删除列

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

【问题讨论】:

  • ...如果解决方案很好,您当然应该保留这个问题。这就是网站的全部意义所在。

标签: list .net-2.0


【解决方案1】:

为什么不使用List&lt;T&gt;.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);
}

这可以为您节省另一个列表和多次迭代的成本。

【讨论】:

  • 你说得对,我只是以整数为例,但还是谢谢
  • @Jan-Frederik Carl - 查看第二个示例,使用单个反向循环删除符合您的条件的项目。
【解决方案2】:

尝试全部删除:

public bool MyPredicate(int i){
  return i == 3 || i == 5;
}

ints.RemoveAll(MyPredicate);

或者如果您有权访问匿名代表:

ints.RemoveAll( (i) => i == 3 || i == 5 );

此外,从 SO 中删除您的问题通常不是一个好主意,以便将来可能有相同问题的人可以阅读并从中学习。

【讨论】:

    【解决方案3】:

    可以在下面找到 RemoveAll 的更详细示例(指向 .NET 2.0 的链接):

    List<T>.RemoveAll Method

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-20
      • 2016-05-08
      • 2011-03-18
      • 2015-08-24
      • 1970-01-01
      • 2010-12-15
      • 2020-12-07
      相关资源
      最近更新 更多