[英]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.