我正在尝试删除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")
但它只删除第一次出现
答案 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>
class和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)。
答案 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);