2016-08-08 4 views
0

У меня есть List<Fill> itemsУдалить элемент из пользовательского списка

Вот Fill класс:

public class Fill 
{ 
    public string arret { get; set;} 
    public string ligneSens { get; set;} 
} 

Как я могу удалить элемент из этого списка, используя значение строки arret и ligneSens?

Пример:

void OnDelete(object sender, EventArgs e, string arretName, string ligneSensName) 
{ 
    var aFill = new Fill 
    { 
     arret = arretName, 
     ligneSens = ligneSensName 
    }; 

    items.Remove(aFill); //<--- this doesn't work 
} 

Извините за титул поста я не знаю, как спросить, что.

ответ

6

Вы должны переопределить методы Equals и GetHashCodeobject. Когда вы вызываете Remove в ссылочном типе (классах), он будет искать один по методу Equals.

public class Fill 
{ 
    public string arret { get; set; } 
    public string ligneSens { get; set; } 

    public override bool Equals(object obj) 
    { 
     var other = obj as Fill; 
     if(other == null) 
      return false; 

     return other.arret == arret && other.ligneSens == ligneSens; 
    } 

    public override int GetHashCode() 
    { 
     return arret.GetHashCode()^
       ligneSens.GetHashcode(); 
    } 
} 

Для того, что лучшие практики по GetHashCode() наиважнейшей поиска в Интернете, Есть много вопросов по этому поводу

Другой способ, чтобы сказать конкретно, что remove пропусканием предикат для оценки для каждого элемента в коллекции:

items.RemoveAll(item => item.arret = arretName && 
         item.ligneSens == ligneSensName); 
+0

Что я должен реализовать Я не знаю Equals и GetHashCode? У вас есть код разработки? –

+0

Да, еще один вариант - определить равенство для '' Fill'' –

2

Использование списка API RemoveAll

items.RemoveAll(x => x.arret.Equals("value") && x.ligneSensName.Equals("ligneValue"));

+5

. Чтобы быть точным: 'RemoveAll' не имеет ничего общего с LINQ, это метод экземпляра' List '. LINQ имеет функциональный подход и не изменяет существующие коллекции или их элементы. –

+0

@ RenéVogt спасибо, что указали это, я использую термин api, используя выражение lamba, как LINQ – Sherlock

4

Вы должны использовать RemoveAll() для этого, в настоящее время вы передаете вновь созданный объект, о котором items не имеет информации, потому что это новая ссылка не та же ссылка:

void OnDelete(object sender, EventArgs e, string arretName, string ligneSensName) 
{ 
    items.RemoveAll(item => item.arret == arretName && item.ligneSens == ligneSensName); 
} 
+0

редактировать назначение hehe – Sherlock

+0

Спасибо за указание @Sherlock исправлено –

Смежные вопросы