2017-09-20 29 views
0

オブジェクトの "DataPerLabel"でいっぱいの重複を削除しようとしています。オブジェクトのarraylistから重複を削除します

DataPerLabelには、getLabelname()、getLabelAdress()、およびgetDataType()メソッドが含まれています。

いくつかの背景情報:

値のラベル名、labelAdressとデータ型は、送信ボタンによりALLDATAという名前のArrayListに1つのオブジェクトとして設定することができます。サブミッションが2回目に押されると、私はarraylistのそのオブジェクトを削除します。

画像:Example

私が試したコードの一部:

このコードで
if (submitButtonClicked == true) { 
    if (MessageBox.Show("This is item is already set. Do you want to delete?", "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { 
    foreach(DataPerLabel item in allData) { 
     if (item.getDataType().Equals(dataType) && item.getLabelAdress().Equals(adress) && item.getLabelName().Equals(label)) { 
      allData.Remove(item); 
     } else { 

     } 
    } 
    } else { 
    //no 
    } 

} 

私は次のエラーを取得しています:「System.InvalidOperationException」種類の未処理の例外がで発生しましたmscorlib.dll。

追加エラー情報:コレクションが変更されました。

+2

での可能な複製をあなたのための新しいのArrayListを作成します:// stackoverflowの.com/questions/4786919/linq-distinct-implemented-equals-gethashcode) – pix

答えて

3

すべてのデータリストで反復しようとしていますが、同じリストを変更しようとしています。他のリスト(例えば:removeItems)でデータを削除したままにしておけば、アイテムを削除することができます。私は意味:

if (submitButtonClicked == true) { 
     if (MessageBox.Show("This is item is already set. Do you want to delete?", "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { 
List<DataPerLabel> removeItems = new List<DataPerLabel>(); 
     foreach(DataPerLabel item in allData) { 
      if (item.getDataType().Equals(dataType) && item.getLabelAdress().Equals(adress) && item.getLabelName().Equals(label)) { 
       removeItems.Add(item); 
      } else { 

      } 
     } 
     } else { 
     //no 
     } 

    foreach(DataPerLabel removeItem in removeItems){ 
     allData.Remove(removeItem); 
     } 

} 
+0

2番目のforeachではなく、より簡単になりますが、次のようになります: allData.RemoveRange(removeItems); – Pawelotti

+0

私はこの方法を使用してくれました。みなさんありがとう! – NielsSchutte

0
 //Here is just an example of list of array 
     List<object> obj = new List<object>(); 
     obj.Add(5); 
     obj.Add(4); 
     obj.Add("we"); 
     obj.Add(5); 
     List<object> objTodelete = new List<object>(); 

     foreach (var item in obj) 
     { 
      int count = obj.Count(a => a.ToString() == item.ToString()); 
      //for finding the dublicate occurence 
      if (count > 1) 
      { 
       //for removing that dublicated occurence. 
       object Dublicate = obj.Find(m => m.ToString() == item.ToString()); 
       if (!objTodelete.Contains(Dublicate)) 
       { 
        objTodelete.Add(Dublicate); 
       } 
      } 
     } 
     foreach (var itemDublicate in objTodelete) 
     { 
      obj.Remove(itemDublicate); 
     } 
+0

まず、オカレンスのループを作成し、そのオカレンスのインデックスを見つけて削除します。 –

+0

なぜ最初に 'Count'を持つオブジェクトがあるかどうかチェックし、そうであればもう一度問い合わせますか?あなたが 'if(item!= null){'と '' if 'をチェックするだけで 'var item = obj.FirstOrDefault(a => a.ToString()== item.ToString()); obj.Remove(item); '。 – nbokmans

+0

これは、作成者の 'System.InvalidOperationException'と同じ例外が発生します。オブジェクトを反復処理中にオブジェクトを変更することはできません – OlegI

0

OnurBulbulは、あなたがあなたを介して反復されているリストを変更しようとしているため、例外を取得言ったように。異なる解決策がたくさんあります。私の提案は、LINQを使用することです:

var sortedList = from item in allData 
       where !(item.getDataType().Equals(dataType) && item.getLabelAdress().Equals(adress) && item.getLabelName().Equals(label)) 
       select item 

それは(HTTPS [等号&GetHashCodeメソッドを実装し、LINQ&明確な]すべてのアウトソートされたデータ

関連する問題