从对象的arraylist中删除重复项

时间:2017-09-20 06:53:26

标签: c# arraylist duplicates

我试图删除填充了对象的一个 arraylist的副本" DataPerLabel"。

DataPerLabel包含以下方法:getLabelname(),getLabelAdress()和getDataType()。

一些背景资料:

值labelname,labelAdress和dataType可以通过提交按钮在名为allData的arraylist中设置为1个对象。当第二次按下提交时,我想删除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。

其他错误信息:收藏已更改。

3 个答案:

答案 0 :(得分:3)

您正在尝试迭代allData列表,并且您还尝试修改相同的列表。您可以继续删除其他列表中的数据(例如: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);
      }

}

答案 1 :(得分: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);
        }

答案 2 :(得分:0)

正如OnurBulbul所说,由于尝试修改您正在迭代的列表,因此会出现异常。可以有很多不同的解决方案。我的建议是使用LINQ:

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

它将为您创建一个包含所有已排序数据的新arrayList