簡體   English   中英

C#參考比較

[英]C# reference comparison

當您嘗試比較兩個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是使用編組實現的。

這個內存指針一直在變化,我猜這里發生了某種克隆,但我無法理解我應該做什么。

我做錯了什么,我怎么能真正比較從一個IEnumerable<>序列中獲取的System.Drawing.Image對象,看看它們是否相同?

謝謝。


更新

        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() ,這顯然不起作用,我非常愚蠢。

感謝大家。

請記住,每次調用GetEnumerator您都會看到每次調用MoveNext返回的新對象。 您需要做的是強制迭代到列表中。

var imageList = images.ToList();

通過image1 == image2您只是比較圖像的參考(不是圖像逐像素)。

通過調用Image.FromFile(path) ,每次調用此方法時都會創建新的圖像對象(即使路徑相同),因此它們始終具有不同的引用。

我不知道是否有一種方法可以逐像素地比較圖像,但當然你可以為它實現自己的機制(看起來並不困難)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM