Loại dữ liệu dấu thời gian của MS SQL Server tương đương ngữ nghĩa với nhị phân (8) (nếu không có giá trị null) hoặc varbinary (8) (nếu nullable). Ergo, so sánh chúng như mảng byte.
Chưa kể đến chi phí liên quan đến việc chuyển đổi thành dài. Bạn có thể viết một số mã không an toàn để lấy địa chỉ của các mảng byte, đưa chúng đến các con trỏ dài và dereference chúng thành longs, NHƯNG để làm điều đó một cách an toàn có nghĩa là ghim chúng vào bộ nhớ và một loạt các mã xấu xí để làm điều gì đó đơn giản (và có lẽ không nhanh hơn sử dụng BitConverter).
Cách nhanh nhất để làm điều đó, nếu hiệu suất là thực sự quan trọng, cách nhanh nhất sẽ được để làm việc so sánh sử dụng memcmp() chức năng tiêu chuẩn C thư viện thông qua P/Invoke:
using System;
using System.Runtime.InteropServices;
namespace TestDrive
{
class Program
{
static void Main()
{
byte[] a = { 1,2,3,4,5,6,7,8} ;
byte[] b = { 1,2,3,4,5,0,7,8} ;
byte[] c = { 1,2,3,4,5,6,7,8} ;
bool isMatch ;
isMatch = TimestampCompare(a , b) ; // returns false
isMatch = TimestampCompare(a , c) ; // returns true
return ;
}
[DllImport("msvcrt.dll", CallingConvention=CallingConvention.Cdecl)]
static extern int memcmp(byte[] x , byte[] y , UIntPtr count) ;
static unsafe bool TimestampCompare(byte[] x , byte[] y)
{
const int LEN = 8 ;
UIntPtr cnt = new UIntPtr((uint) LEN) ;
// check for reference equality
if (x == y) return true ;
if (x == null || x.Length != LEN || y == null || y.Length != LEN)
{
throw new ArgumentException() ;
}
return (memcmp( x , y , cnt) == 0 ? true : false) ;
}
}
}
@Nicholas rất cool –
Jest một lập trình viên bán trường C ^) –
@Nicholas +1 nó rất hay nhưng tôi muốn tránh mã không an toàn. –