Удалить из списка элементы, которые имеют поля, равные некоторым элементам полей - PullRequest
0 голосов
/ 11 декабря 2018

Вот мой код:

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 всех лиц, которые имеют одинаковые значения age и grade, которые personToRemove имеет.

Ответы [ 3 ]

0 голосов
/ 11 декабря 2018

Вы можете использовать , где метод, чтобы отфильтровать результат

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);
0 голосов
/ 11 декабря 2018

Так как вы ищете некоторые другие без списка. Удалите все.Вы можете использовать list.Except method

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();
0 голосов
/ 11 декабря 2018

Вы должны использовать .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 });

Выход:

enter image description here

Редактировать:

Вы также можете использовать традиционный цикл для элегантного удаления участника матча из списка лиц.

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