C#参考比较

时间:2011-03-28 17:02:33

标签: c# image reference comparison marshalling

当您尝试比较两个System.Drawing.Image实体时,有人知道可能出现的问题吗?

我有一些IEnumerable<Image> images,它是使用Image.FromFile(path)方法迭代构造的。

但是下面的代码会产生我无法理解的结果:

foreach (var image1 in images)
{
    foreach (var image2 in images)
    {
        if (image1 == image2)
        {
            // (Do something!)
        }
    }
}

问题是(Do something!)部分永远不会被调用。

调试器显示图像对象有一个名为nativeImage的属性,我假设它是一个原始内存指针,因为System.Drawing.Image是使用编组实现的。

这个内存指针一直在变化,我想这里会发生某种克隆,但我无法理解我应该做些什么。

我做错了什么?我如何实际比较从System.Drawing.Image序列获取的IEnumerable<>个对象,看它们是否相同?

谢谢。


更新

        var paths = new List<String> {"Tests/1_1.jpg", "Tests/1_2.jpg"};
        IEnumerable<Image> images = paths.Select(path => Image.FromFile(path)).ToList();

        foreach (var image1 in images)
        {
            foreach (var image2 in images)
            {
                if (ReferenceEquals(image1, image2))
                {

                }
            }
        }

没有ToList(),这显然不起作用,我非常愚蠢。

谢谢大家。

2 个答案:

答案 0 :(得分:2)

请记住,每次拨打GetEnumerator时,您都会看到每次拨打MoveNext时都会返回新对象。您需要做的是强制迭代到列表中。

var imageList = images.ToList();

答案 1 :(得分:1)

通过image1 == image2,您只是比较图像的参考(不是图像逐像素)。

通过调用Image.FromFile(path),每次调用此方法时都会创建新的图像对象(即使路径相同),因此它们总是有不同的引用。

我不知道是否有一种方法可以逐像素地比较图像,但当然你可以为它实现自己的机制(看起来并不困难)。