【问题标题】:Remove from list items that have fields equal to some item fields从列表中删除字段等于某些项目字段的项目
【发布时间】:2019-05-12 02:33:36
【问题描述】:

这是我的代码:

public class Person
{
    public int age;
    public int grade;
    public string name;
}

List<Person> _list = new List<Person>();
// .... add lots of items
var personToRemove = new Person {age = 99, grade = 7, };

如何编写一个命令,从_list 中删除所有与personToRemove 具有相同agegrade 值的人。

【问题讨论】:

    标签: c# list removeall


    【解决方案1】:

    您必须使用 .RemoveAll() 和谓词来删除 personToRemove 人员对象中具有匹配详细信息的所有人员。

    所以你的查询将是。

    int totalRemoved = _list.RemoveAll(x => x.age == personToRemove.age && x.grade == personToRemove.grade);
    

    输入:

    _list.Add(new Person { age = 99, grade = 7 });
    _list.Add(new Person { age = 87, grade = 7 });
    _list.Add(new Person { age = 57, grade = 8 });
    

    输出:

    编辑:

    您还可以使用传统的循环以优雅的方式从人员列表中删除匹配人员。

    for (int i = _list.Count - 1; i >= 0; i--)
    {
        if (_list[i].age == personToRemove.age && _list[i].grade == personToRemove.grade)
        {
            _list.RemoveAt(i);
            break;
        }
    }
    

    【讨论】:

    • 感谢您的回答。我已经使用过它,但我真的希望有更优雅的语法。
    • @Narek,查看答案中的 Edit: 部分,我认为您希望优雅的方法在性能上也具有可读性。
    • 你真的觉得它更优雅? :)
    • @Narek,据我所知RemoveAll 可以在O(n) 中通过检查n 个元素的条件并移动最多n 个元素来完成。并且 with 循环可以用O(n^2) 完成,最多移动 n 个元素。但是如果您希望它具有可读性,那么循环在您的情况下是最好的,但更优雅的是RemoveAll
    • @Narek,很高兴看到我的回答对你有帮助:)
    【解决方案2】:

    你可以使用where方法过滤掉结果

    List <Person> _list = new List <Person> ();
    // .... add lots of items
    var personToRemove = new Person {
      age = 99, grade = 7,
    };
    _list.Add(new Person {
      age = 99, grade = 7
    });
    _list.Add(new Person {
      age = 99, grade = 7
    });
    _list.Add(new Person {
      age = 99, grade = 8
    });
    _list.Add(new Person {
      age = 100, grade = 8
    });
    
    var result = _list.Where(a => a.age != personToRemove.age || a.grade != personToRemove.grade);
    

    【讨论】:

      【解决方案3】:

      由于您正在寻找其他方式,但没有 list.RemoveAll。你可以使用list.Except方法

      List<Person> _list = new List<Person>();
      
      // get the list of Person you want to remove by using where.
      List<Person> _Removelist = _list.Where(x => x.age == personToRemove.age && x.grade == personToRemove.grade).ToList();
      
      List<Person> _finalList = _list.Except(_Removelist ).ToList();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-28
        • 2021-12-08
        • 2015-04-06
        • 2016-06-24
        • 2021-04-03
        • 2012-02-21
        • 2015-06-06
        • 2012-08-18
        相关资源
        最近更新 更多