删除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.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);