2016-08-08 8 views
0

から項目を削除し、私はここでList<Fill> itemsカスタムリスト

Fillクラスである必要がありますか?

例:私はそれを聞いてする方法を知りませんでした投稿のタイトルのため

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

objectEqualsGetHashCodeの方法を上書きする必要があります。参照型(クラス)のRemoveを呼び出すと、それはEqualsメソッドによって1つを検索します。

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

何私はイコールと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これを指摘してくれてありがとう、私はLINQとしてlamba式を使ってAPIを使うのに慣れていた – Sherlock

4

それは、新たな基準ではない、同一の参照であるため、あなたは、現在あなたがitemsが情報を持っていないかについて新しく作成されたオブジェクトを、渡している、そのためRemoveAll()を使用する必要があります。

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

割り当てheheを編集する – Sherlock

+0

@Sherlockを指摘してくれてありがとう –