DGKumar Ответов: 1

Как удалить элементы из объекта списка в C#


У меня есть какой-то список, и мне нужно вернуть только выбранный элемент.
кроме обязательных значений, оставшихся все потребности должны быть удалены из моего объекта списка.
для этого я написал код, как показано ниже, но получаю эту ошибку:
collection was modified enumeration operation


Что я уже пробовал:

class Program
{
    static void Main()
    {
        UserDetails obj = new UserDetails();
        obj.listUserDetails = obj.GetUserDetails();
        UserDetails obj1 = new UserDetails();
        string userIdentifier = "i3";
        foreach(var userDetail in obj.listUserDetails)
        {
            if (userDetail.Identifier != userIdentifier)
            {
                obj.listUserDetails.RemoveAll(a => a.Identifier != userIdentifier);
            }
        }
        foreach (var item in obj.listUserDetails)
        {
            Console.WriteLine(item.Identifier);
        }
        Console.Read();
    }
}
public class UserDetails
{
    public int UserID { get; set; }
    public string UserName { get; set; }
    public string Identifier  { get; set; }
    public List<UserDetails> listUserDetails { get; set; }

    public List<UserDetails> GetUserDetails()
    {
        List<UserDetails> listUserDetails = new List<UserDetails>()
        {
            new UserDetails() { UserID=1,UserName="TestData",Identifier="i1"},
             new UserDetails() { UserID=2,UserName="TestData1",Identifier="i2"},
              new UserDetails() { UserID=3,UserName="TestData2",Identifier="i3"},
               new UserDetails() { UserID=4,UserName="TestData3",Identifier="i4"},
                new UserDetails() { UserID=5,UserName="TestData4",Identifier="i5"},
                 new UserDetails() { UserID=6,UserName="TestData5",Identifier="i6"},
        };
        return listUserDetails;
    }
  
}

Richard Deeming

В этом случае вам даже не понадобится первый foreach петля. То RemoveAll метод удалит все элементы, соответствующие предоставленному предикату; вам не нужно вызывать его несколько раз с одним и тем же предикатом.

1 Ответов

Рейтинг:
2

OriginalGriff

Y не может изменить коллекцию, пока она повторяется: если вы подумаете об этом, вы поймете, почему. Что произойдет, если вы это сделаете? Количество элементов может измениться, так что же будет "следующим" элементом? И так далее.

Таким образом, чтобы удалить элементы из коллекции, создайте новую коллекцию элементов для удаления, а затем удалите их все после обработки всей коллекции.

Возможно, вы также захотите прочитать это: List<T> - действительно ли это так эффективно, как вы, вероятно, думаете?[^]