.net核心列表removeall()方法很奇怪

时间:2019-11-24 14:41:01

标签: 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 list.Count.ToString();

列表计数应为3,但仍为4。RemoveAll()方法中是否有错误?如果使用List rathan而不是IList声明,则效果很好。

修改 1.如果不使用ToList()方法,则没有要调用的RemoveAll()方法。

  1. 如何避免这种情况使用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");
    }
    
  2. 如果有新的支持方法,那就更好了。谢谢大家。

2 个答案:

答案 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
相关问题