Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .net核心列表removeall()方法很奇怪_C#_List - Fatal编程技术网

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()方法

  • 如何避免这种情况使用IList作为参数,列表首先是引用类型。我是否应该完全使用IList作为声明?我们在项目中使用了IList

    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)