删除ArrayList中出现的所有项

本文关键字:ArrayList 删除 | 更新日期: 2023-09-27 18:23:58

我正在尝试删除数组列表中出现的所有项目

ArrayList list=new ArrayList();
list.Add("2.2");
list.Add("2.5");
list.Add("2.6");
list.Add("2.2");
list.Add("2.5");
list.Add("2.2");

如何从列表中删除所有2.2值?我用过

list.Remove("2.2")

但它只删除第一次出现的

删除ArrayList中出现的所有项

阅读ArrayList.Remove()上的文档,特别是:

从ArrayList中删除第一个出现的特定对象。

为什么要使用ArrayList?您的示例中的元素都是相同的类型,您最好使用List<string>,然后使用RemoveAll,例如

List<string> list = new List<string>();
list.add("2.2");
list.add("2.5");
list.add("2.6");
list.add("2.2");
list.add("2.5");
list.add("2.2");
list.RemoveAll(item => item == "2.2");

ArrayList.Remove的描述很清楚:

从ArrayList中删除特定对象的首次出现(强调矿)

你可以这样做:

while (list.Contains("2.2"))
{
    list.Remove("2.2");
}

如上所述,使用列表是最佳选择。但如果你坚持使用ArrayList,那么你可以这样做。

ArrayList list = new ArrayList();
list.Add("2.2");
list.Add("2.2");
list.Add("2.5");
list.Add("2.6");
list.Add("2.2");
list.Add("2.5");
do{
    list.Remove("2.2"); 
} while (list.Contains("2.2"));

可能是另一种方式。。

list.Sort();
int i = list.LastIndexOf("2.2");
int j = list.IndexOf("2.2");
list.RemoveRange(j,i-j+1);

新方法

.NET框架中的泛型集合是用来取代过时的ArrayList的,它有一定的设计和性能问题。

以下是使用List<T>类和List<T>.RemoveAll(Predicate)方法的示例:

var list=new List<string>();
list.Add("2.2");
list.Add("2.5");
list.Add("2.2");
// ...
list.RemoveAll(item => item == "2.2");

遗留代码问题

但是,在某些情况下,我们必须使用过时的ArrayList类,例如在使用遗留代码时。

更重要的是,有时遗留API需要使用相同的ArrayList实例,在这种情况下,我们需要一种快速可靠的方法来使用。

填补空白

以下是RemoveAll扩展的一个实现,它填补了这一空白:

public static class ArrayListExtensions
{
    /// <summary>
    /// Removes all the elements equal to <paramref name="sample"/>.
    /// </summary>
    /// <param name="list">List to remove from.</param>
    /// <param name="sample">Element to remove.</param>
    /// <returns>Returns the number of removed elements.</returns>
    public static int RemoveAll(this ArrayList list, object sample)
    {
        if (list == null)
            throw new ArgumentNullException("list");
        var n = list.Count;
        var nextOut = 0;
        var nextIn = 0;
        for (; nextIn < n && nextIn == nextOut; nextIn++)
        {
            var token = list[nextIn];
            if (!Equals(token, sample))
            {
                nextOut++;
            }
        }
        for (; nextIn < n; nextIn++)
        {
            var token = list[nextIn];
            if (!Equals(token, sample))
            {
                list[nextOut] = token;
                nextOut ++;
            }
        }
        if (nextOut < list.Count)
        {
            var toRemove = list.Count - nextOut;
            list.RemoveRange(nextOut, toRemove);
            return toRemove;
        }
        return 0;
    }
}

该方法只进行必要的底层ArrayList API调用,就地工作,并且除了实际需要的O(n)之外没有增加复杂性。

有很多方法:

int index;
while ((index = list.IndexOf("2.2")) > -1)
{
    list.RemoveAt(index);
}

或:

while (list.Contains("2.2"))
{
    list.Remove("2.2");
}

或:

list = new ArrayList(list.Cast<string>().Where(item => s != "2.2"));

最简单的方法是使用lambda函数和RemoveAll:

list.RemoveAll(x => x == 2.2)
ArrayList arryList2 = new ArrayList();
arryList2.Add(100);
arryList2.Add(200);
arryList2.Add(100);
while (arryList2.Contains(100))
arryList2.Remove(100);