这看起来很简单,但是会发生此错误。
IList<string> list = new List<string>();
list.Add("001");
list.Add("002");
list.Add("003");
list.Add("004");
list.ToList().RemoveAll(s => s == "002");
return list.Count.ToString();
列表计数应为3,但仍为4。RemoveAll()方法中是否有错误?如果使用List rathan而不是IList声明,则效果很好。
修改 1.如果不使用ToList()方法,则没有要调用的RemoveAll()方法。
如何避免这种情况使用IList作为参数,列表首先是引用类型。我不应该将IList完全用作声明吗?我们已经在项目中使用IList Everythere。
public string List()
{
IList<string> list = new List<string>();
list.Add("001");
list.Add("002");
list.Add("003");
list.Add("004");
Remove(list);
return list.Count.ToString();
}
private void Remove(IList<string> list)
{
list.ToList().RemoveAll(a => a == "002");
}
答案 0 :(得分:5)
在使用ToList
时,您实际上创建了列表的浅表副本,然后将RemoveAll
应用于新列表,因此,原始列表不会受到影响。 / p>
如果您只查找没有-“ 002”项的计数,则简单计数就足够了
list.Count - list.Count(i => i == "002");
否则,如果您实际上要从原始列表中删除这些项目,则需要使用for循环以旧的方式解决它。
无论如何,如果IList
不那么重要,则可以将列表另存为List
而不是IList
,并使用RemoveAll
方法。
答案 1 :(得分:1)
ToList()
返回原始list
的浅表副本(即它是一个新实例,对其所做的修改将不会反映在list
中)。
由于您需要使用RemoveAll
方法,因此建议您将变量存储为List
而不是IList
:
List<string> list = new List<string>();
list.Add("001");
list.Add("002");
list.Add("003");
list.Add("004");
list.RemoveAll(s => s == "002");
Console.WriteLine(list.Count()); // 3
您还可以使用LINQ运算符实现相同的目的:
List<string> list = new List<string>();
list.Add("001");
list.Add("002");
list.Add("003");
list.Add("004");
list = list.Where(s => s != "002").ToList();
Console.WriteLine(list.Count());
更简洁:
List<string> list = new List<string>(new[] {
"001",
"002",
"003",
"004"
});
// or
//List<string> list = new[] {
// "001",
// "002",
// "003",
// "004"
//}.ToList();
Console.WriteLine(list.Count(s => s != "002")); // 3