2015-04-16 6 views
3

Последовательные GUID уникальны, но создаются с заказом; этот порядок немного необычен и отличается от порядка, достигнутого при использовании стандартного компаратора .NET Guid.Как отсортировать последовательные GUID в C#?

Я ищу сопоставитель C# Guid, который будет сортировать по правилам последовательных GUID.

== UPDATE ==

Я специально со ссылкой на последовательных GUIDs созданных NEWSEQUENTIALID() в SQL Server, хотя теперь я понимаю, что стандартный Win32 API называют UuidCreateSequential() использует другую схему для SQL Server (я предположил, что они были такими же, когда я написал вопрос).

== 2 == ОБНОВЛЕНИЕ

petelids дает ответ ниже, с использованием, например, Список <System.Data.SqlGuid> .Sort() дает следующую последовательность (используя первоначальный список GUIDs с 1 в каждом 4 разрядном месте) ...

01000000-0000-0000-0000-000000000000 
10000000-0000-0000-0000-000000000000 
00010000-0000-0000-0000-000000000000 
00100000-0000-0000-0000-000000000000 
00000100-0000-0000-0000-000000000000 
00001000-0000-0000-0000-000000000000 
00000001-0000-0000-0000-000000000000 
00000010-0000-0000-0000-000000000000 
00000000-0100-0000-0000-000000000000 
00000000-1000-0000-0000-000000000000 
00000000-0001-0000-0000-000000000000 
00000000-0010-0000-0000-000000000000 
00000000-0000-0100-0000-000000000000 
00000000-0000-1000-0000-000000000000 
00000000-0000-0001-0000-000000000000 
00000000-0000-0010-0000-000000000000 
00000000-0000-0000-0001-000000000000 
00000000-0000-0000-0010-000000000000 
00000000-0000-0000-0100-000000000000 
00000000-0000-0000-1000-000000000000 
00000000-0000-0000-0000-000000000001 
00000000-0000-0000-0000-000000000010 
00000000-0000-0000-0000-000000000100 
00000000-0000-0000-0000-000000001000 
00000000-0000-0000-0000-000000010000 
00000000-0000-0000-0000-000000100000 
00000000-0000-0000-0000-000001000000 
00000000-0000-0000-0000-000010000000 
00000000-0000-0000-0000-000100000000 
00000000-0000-0000-0000-001000000000 
00000000-0000-0000-0000-010000000000 
00000000-0000-0000-0000-100000000000 

В отличие от следующей последовательности, возвращаемой Список <System.Guid> .Sort()

00000000-0000-0000-0000-000000000001 
00000000-0000-0000-0000-000000000010 
00000000-0000-0000-0000-000000000100 
00000000-0000-0000-0000-000000001000 
00000000-0000-0000-0000-000000010000 
00000000-0000-0000-0000-000000100000 
00000000-0000-0000-0000-000001000000 
00000000-0000-0000-0000-000010000000 
00000000-0000-0000-0000-000100000000 
00000000-0000-0000-0000-001000000000 
00000000-0000-0000-0000-010000000000 
00000000-0000-0000-0000-100000000000 
00000000-0000-0000-0001-000000000000 
00000000-0000-0000-0010-000000000000 
00000000-0000-0000-0100-000000000000 
00000000-0000-0000-1000-000000000000 
00000000-0000-0001-0000-000000000000 
00000000-0000-0010-0000-000000000000 
00000000-0000-0100-0000-000000000000 
00000000-0000-1000-0000-000000000000 
00000000-0001-0000-0000-000000000000 
00000000-0010-0000-0000-000000000000 
00000000-0100-0000-0000-000000000000 
00000000-1000-0000-0000-000000000000 
00000001-0000-0000-0000-000000000000 
00000010-0000-0000-0000-000000000000 
00000100-0000-0000-0000-000000000000 
00001000-0000-0000-0000-000000000000 
00010000-0000-0000-0000-000000000000 
00100000-0000-0000-0000-000000000000 
01000000-0000-0000-0000-000000000000 
10000000-0000-0000-0000-000000000000 
+3

Что такое "немного необычный"? Как мы можем предложить что-либо, не зная, как их упорядочить? – DavidG

+0

Не рекомендуется указывать guid – CarbineCoder

+2

@CarbineCoder: Без какого-либо дополнительного контекста это утверждение абсурдно. Если вы используете идентификаторы GUID в качестве идентификатора, заказ элементов по этим идентификаторам GUID позволяет, например, ускорить поиск. –

ответ

6

Там разница между Sql сервером пути и GUIDs сортировки .NET.

В структуре .NET есть структура, называемая SqlGuid, которая должна вести себя так же, как и указатели на Sql Server.

Рассмотрим следующий пример адаптировано из here:

List<Guid> a = new List<Guid>(); 
a.Add(new Guid("3AAAAAAA-BBBB-CCCC-DDDD-2EEEEEEEEEEE")); 
a.Add(new Guid("2AAAAAAA-BBBB-CCCC-DDDD-1EEEEEEEEEEE")); 
a.Add(new Guid("1AAAAAAA-BBBB-CCCC-DDDD-3EEEEEEEEEEE")); 
Console.WriteLine("--Unsorted Guids--"); 
foreach (Guid g in a) 
{ 
    Console.WriteLine("{0}", g); 
} 
a.Sort(); 
Console.WriteLine("--Sorted Guids--"); 
foreach (Guid g in a) 
{ 
    Console.WriteLine("{0}", g); 
} 

List<SqlGuid> b = new List<SqlGuid>(); 
b.Add(new SqlGuid("3AAAAAAA-BBBB-CCCC-DDDD-2EEEEEEEEEEE")); 
b.Add(new SqlGuid("2AAAAAAA-BBBB-CCCC-DDDD-1EEEEEEEEEEE")); 
b.Add(new SqlGuid("1AAAAAAA-BBBB-CCCC-DDDD-3EEEEEEEEEEE")); 
b.Sort(); 
Console.WriteLine("--Sorted SqlGuids--"); 
foreach (SqlGuid sg in b) 
{ 
    Console.WriteLine("{0}", sg); 
} 

Это производит выход:

--Unsorted Guids--
3aaaaaaa-BBBB-КЦИК-дддд-2eeeeeeeeeee
2aaaaaaa -bbbb-cccc-dddd-1eeeeeeeeeee
1aaaaaaa-bbbb-cccc-dddd-3eeeeeeeeeee
--Сортировать Guids--
1aaaaaaa-BBBB-КЦИК-дддд-3eeeeeeeeeee
2aaaaaaa-BBBB-КЦИК-дддд-1eeeeeeeeeee
3aaaaaaa-BBBB-КЦИК-дддд-2eeeeeeeeeee
--Sorted SqlGuids--
2aaaaaaa-bbbb- сссс-DDDD-1eeeeeeeeeee
3aaaaaaa-BBBB-сссс-DDDD-2eeeeeeeeeee
1aaaaaaa-BBBB-сссс-DDDD-3eeeeeeeeeee

SqlGuid класс имеет конструктор, который принимает Guid и литье от одного к другому также w orks, поэтому преобразование между ними должно быть достаточно простым.Добавление следующих строк в приведенном выше коде, например:

List<SqlGuid> c = a.Select(g => new SqlGuid(g)).ToList(); 
c.Sort(); 
Console.WriteLine("--Sorted SqlGuids 2--"); 
foreach (SqlGuid sg2 in c) 
{ 
    Console.WriteLine("{0}", sg2); 
} 

добавляет выход:

--Sorted SqlGuids 2--
2aaaaaaa-BBBB-КЦИК-дддд-1eeeeeeeeeee
3aaaaaaa-BBBB -cccc-DDDD-2eeeeeeeeeee
1aaaaaaa-BBBB-сссс-DDDD-3eeeeeeeeeee