मैंने समानता (बाइट-फॉर-बाइट) के लिए दो धाराओं की तुलना करने के लिए एक विस्तार विधि अनुकूलित की - यह जानकर कि यह एक गर्म विधि है जिसे मैंने यथासंभव अनुकूलित करने की कोशिश की है (धाराएं बहु-मेगाबाइट लंबाई तक पहुंच सकते हैं)। मैं अनिवार्य रूप से निम्नलिखित दृष्टिकोण के साथ आया था:अगर स्टेटमेंट ट्रू ब्लॉक निष्पादित होता है तो कंडीशन गलत होती है
[StructLayout(LayoutKind.Explicit)]
struct Converter
{
[FieldOffset(0)]
public Byte[] Byte;
[FieldOffset(0)]
public UInt64[] UInt64;
}
/// <summary>
/// Compares two streams for byte-by-byte equality.
/// </summary>
/// <param name="target">The target stream.</param>
/// <param name="compareTo">The stream to compare the target to.</param>
/// <returns>A value indicating whether the two streams are identical.</returns>
public static bool CompareBytes(this Stream target, Stream compareTo)
{
if (target == null && compareTo == null)
return true;
if (target == null || compareTo == null)
return false;
if (target.Length != compareTo.Length)
return false;
if (object.ReferenceEquals(target, compareTo))
return true;
if (!target.CanRead || !target.CanSeek)
throw new ArgumentOutOfRangeException("target");
if (!compareTo.CanRead || !compareTo.CanSeek)
throw new ArgumentOutOfRangeException("target");
lock (target)
{
lock (compareTo)
{
var origa = target.Position;
var origb = compareTo.Position;
try
{
target.Position = compareTo.Position = 0;
// Shrink the number of comparisons.
var arr1 = new byte[4096];
var convert1 = new Converter() { Byte = arr1 };
var arr2 = new byte[4096];
var convert2 = new Converter() { Byte = arr2 };
int len;
while ((len = target.Read(arr1, 0, 4096)) != 0)
{
if (compareTo.Read(arr2, 0, 4096) != len)
return false;
for (var i = 0; i < (len/8) + 1; i++)
if (convert1.UInt64[i] != convert2.UInt64[i])
return false;
}
return true;
}
finally
{
target.Position = origa;
compareTo.Position = origb;
}
}
}
}
समस्या यह है कि convert1.UInt64[i] != convert2.UInt64[i]
if
ब्लॉक (false
लौटने) मूल्यांकन किया जा रहा है, तब भी जब मान बराबर हो रहा है। मैंने व्यक्तिगत रूप से प्रत्येक को चेक किया, फिर 'बराबर नहीं' के नतीजे की जांच की। मैं शुद्ध अविश्वास में हूँ:
मैं अनुदेश सूचक के साथ गड़बड़ नहीं है - यह कैसे कोड निष्पादित और घड़ी पिन लाइव है।
कोई विचार यह कैसे हो सकता है?
यह काम करता है यदि आप {} – rerun
एक तुलना तुलना की तरह दिखते हैं (अलग ऑब्जेक्ट्स, हमेशा झूठी) मूल्य तुलना – Alex
के बजाय हो रहा है, मैं उलझन में हूं, दोनों संरचना गुणों में फ़ील्डऑफसेट 0 है, आप कैसे जानते हैं सेब और सेब की तुलना कर रहे हैं? – mtijn