1

チェックボックスがオンになっているときに画像のリストに画像を追加しようとしています。チェックボックスがオフになっているときは、リストから画像を削除します。画像の追加は正常に機能しますが、ボックスのチェックを外すと、リストから画像が削除されません。

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"));

それもうまくいきませんでした。私は何を間違っていますか?

4

3 に答える 3

4

問題は、クラスのインスタンスを操作しているImageため、すべての比較を処理しimages.Removeていて、参照を処理していることです。

新しい画像オブジェクト/参照を作成する場合Image.FromFile(@"C:\Users\joe\documents\radiation.gif")、リストにあるものと同じデータが含まれていますが、参照が同じではないため、削除しても機能しません。

キー文字列が画像のパスである場所を使用して再コーディングする方がよいGeneric.Dictionary<String,Image>場合があります(より適切なキーがない場合)。そうすれば、パスを持つアイテムが辞書にあるかどうかを確認し、同じ方法でそれらを削除できます。

于 2012-07-13T16:14:11.030 に答える
0

デフォルトでは、List.Removeはインスタンス値の比較を使用して、削除する要素を検出します。画像を再度読み込んで削除するため、これは別のインスタンスです。画像が追加されたインデックスを追跡し、それを使用してリストから削除します。CheckBox.Tagは、インデックスを非表示にするのに適した場所かもしれません...

于 2012-07-13T16:14:07.750 に答える
0

式で

x !=  Image.FromFile(@"C:\Users\joe\documents\radiation.gif")

2つのオブジェクトを比較します。

  • オブジェクト1:xはすでにコレクションにある画像です。
  • オブジェクト2:ソースパスに基づいて現時点で作成されるイメージです。

2つを比較すると、これらはオブジェクトImageの2つの異なるインスタンスであるため、常にfalseが返されます。

演算子==のしくみ

于 2012-07-13T16:15:14.350 に答える