我正在尝试在选中复选框时将图像添加到图像列表中,当取消选中该复选框时,我想从列表中删除图像。添加图像可以正常工作,但是当取消选中该框时,它不会从列表中删除图像。
List<Image> images = new List<Image>();
private void chkRadiation_CheckedChanged(object sender, EventArgs e)
{
if (chkRadiation.Checked == true && images.Count < 4)
{
images.Add(Image.FromFile(@"C:\Users\joe\documents\radiation.gif"));
}
else if (chkRadiation.Checked == false)
{
images = images.Where(x => x != Image.FromFile(@"C:\Users\joe\documents\radiation.gif")).ToList();
}
else if
(chkRadiation.Checked == true)
{
MessageBox.Show("Please select only 3 images");
chkRadiation.Checked = false;
}
}
我也试过
images.Remove(Image.FromFile(@"C:\Users\joe\documents\radiation.gif"));
它也没用。 我做错了什么?
答案 0 :(得分:4)
问题是您正在使用类Image
的实例,所以您的所有比较和images.Remove
都在处理引用。
当您Image.FromFile(@"C:\Users\joe\documents\radiation.gif")
创建新的图像对象/引用时,恰好包含与列表中的数据相同的数据,但由于引用不相同,因此删除它不会工作
您可能最好使用Generic.Dictionary<String,Image>
进行重新编码,其中键字符串是图像的路径(没有任何更好的键)。这样你就可以检查字典中是否有带路径的项目,并以相同的方式删除它们。
答案 1 :(得分:0)
默认情况下,List.Remove使用实例值比较来检测要删除的元素。由于您再次加载图像以将其删除,因此这是一个不同的实例。我会跟踪添加图像的索引,并使用它从列表中删除它。 CheckBox.Tag可能是隐藏索引的好地方......
答案 2 :(得分:0)
表达式
x != Image.FromFile(@"C:\Users\joe\documents\radiation.gif")
你比较两个对象:
当你比较两者时,它总是返回false,因为它们是对象Image的两个不同实例。