删除ArrayList中所有出现的项目

时间:2014-09-23 09:26:26

标签: c# arraylist

我正在尝试删除arraylist中所有出现的项目

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

但它只删除第一次出现

7 个答案:

答案 0 :(得分:8)

阅读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");

答案 1 :(得分:3)

新方法

Generic Collections in the .NET Framework可以替换过时的ArrayList内容,因为它存在某些设计和性能问题。

以下是使用List<T> classList<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)。

答案 2 :(得分:3)

ArrayList.Remove的说明很明确:

  

从ArrayList中删除第一次出现的特定对象(强调我的)

你可以这样做:

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

答案 3 :(得分:3)

如上所述,使用List是最佳选择。但如果你坚持使用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);

答案 4 :(得分:2)

有很多方法:

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

答案 5 :(得分:0)

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

list.RemoveAll(x => x == 2.2)

答案 6 :(得分:-3)

ArrayList arryList2 = new ArrayList();
arryList2.Add(100);
arryList2.Add(200);
arryList2.Add(100);

while (arryList2.Contains(100))
arryList2.Remove(100);