使用Array.FindAll删除数组项

时间:2010-10-24 18:01:24

标签: c# .net-2.0

如何删除数组中的项目?

这就是我所拥有的,这不行。

// fr_watchdog.items = public array
string numToRemove = "test";
fr_watchdog.items = Array.FindAll(fr_watchdog.items,
                                  val => val != numToRemove).ToArray();

全部完成。 我找到了解决这个问题的方法(如下所列)。是否可以删除问题?

ArrayList items = new ArrayList();

int index = Array.IndexOf(items, "Delete me");

if ( index != -1 )
{
    string[] copyStrArr = new string[items.Length - 1];
    for ( int i = 0; i < index; i++ )
    {
         copyStrArr[ i ] = items[ i ];
    }
    for ( int i = index ; i < copyStrArr.Length; i++ )
    {
         copyStrArr[ i ] = items[i + 1];
    }
}

2 个答案:

答案 0 :(得分:3)

你不能真正从数组中“删除”一个项目 - 你可以将一个元素的值设置为null(假设它是一个引用类型)但是数组的大小是固定的,所以你不能“删除”任何一个元素超过你可以“添加”一个。

您在问题中显示的内容会创建一个新数组 - 尽管实际上会创建两个数组,因为您在结果上调用了ToArray,没有特别的原因。

鉴于你提到的.NET 2不包含LINQ to Objects,你甚至不清楚调用哪个ToArray方法。你在使用LINQBridge吗?习惯的LINQ方式将是:

fr_watchdog.items = fr_watchdog.items.Where(val => val != numToRemove)
                                     .ToArray();

但是,你已经说过“不行”而没有用什么方式说不好。它将创建一个新的数组,其中填充的值不是numToRemove的值。以什么方式不是你想要的?

如果问题只是ToArray方法不能正确,因为你使用的是没有LINQBridge的.NET 2,那么只需删除对ToArray()的调用来自您原来的FindAll代码。同样,请注意,这不会更改现有数组的内容 - 因此对该原始数组的任何其他引用仍将看到所有原始项。

答案 1 :(得分:0)

fr_watchdog.items可以是只读属性(没有setter的属性)或只读字段(使用{{声明的字段) 1}}关键字)。如果是这种情况,则无法分配给它。