C# .net核心列表removeall()方法很奇怪
这看起来很简单,但是这个错误发生了C# .net核心列表removeall()方法很奇怪,c#,list,C#,List,这看起来很简单,但是这个错误发生了 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 li
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();
IList list=new list();
列表。添加(“001”);
列表。添加(“002”);
列表。添加(“003”);
列表。添加(“004”);
list.ToList().RemoveAll(s=>s==“002”);
return list.Count.ToString();
列表计数应该是3,但仍然是4。RemoveAll()方法中是否存在错误?如果使用列表而不是IList声明,则效果良好
编辑
1.如果不使用ToList()方法,则不会调用RemoveAll()方法
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");
}
公共字符串列表()
{
IList list=新列表();
列表。添加(“001”);
列表。添加(“002”);
列表。添加(“003”);
列表。添加(“004”);
删除(列表);
return list.Count.ToString();
}
私有无效删除(IList列表)
{
list.ToList().RemoveAll(a=>a==“002”);
}
当您使用
ToList
时,实际上创建了列表的一个浅表副本,然后在新列表上应用RemoveAll
,因此,原始列表不会受到影响
如果您只查找“002”项的计数,那么简单的计数就足够了
list.Count - list.Count(i => i == "002");
否则,如果您真的想从原始列表中删除这些项,那么您将需要使用旧的方式解决它,使用for循环
无论如何,如果IList
没有那么重要,您可以将列表另存为list
而不是IList
,并使用RemoveAll
方法。ToList()
返回原始列表的浅层副本(即,它是一个新实例,对它所做的修改不会反映在列表中)
由于需要使用RemoveAll
方法,我建议将变量存储为List
,而不是:
List List=新列表();
列表。添加(“001”);
列表。添加(“002”);
列表。添加(“003”);
列表。添加(“004”);
移除所有(s=>s==“002”);
Console.WriteLine(list.Count());//3
您还可以使用LINQ操作符实现相同的功能:
List List=新列表();
列表。添加(“001”);
列表。添加(“002”);
列表。添加(“003”);
列表。添加(“004”);
list=list.Where(s=>s!=“002”).ToList();
Console.WriteLine(list.Count());
更简洁地说:
List List=新列表(new[]{
"001",
"002",
"003",
"004"
});
//或
//列表=新[]{
// "001",
// "002",
// "003",
// "004"
//}.ToList();
Console.WriteLine(list.Count(s=>s!=“002”);//3
“如果不使用ToList()方法,则没有RemoveAll()方法可调用。”因为您不是将其声明为字符串列表,而是不包含此方法的字符串列表,请将您声明的类型(列表左侧)更改为实际使用的类型(右侧为new)