2015-04-16 3 views
3

Les GUID séquentiels sont uniques mais sont créés avec un ordre; cette commande est légèrement inhabituelle et diffère de l'ordre atteint lors de l'utilisation du comparateur .NET.Comment trier les GUID séquentiels en C#?

Je suis à la recherche d'un comparateur C# qui va trier selon les règles des GUID séquentiels.

== == Mise à jour

Je fais référence à GUIDs séquentiel créé par newsequentialid() dans SQL Server, même si je me rends compte maintenant que l'API Win32 standard appeler UuidCreateSequential() utilise un système différent SQL Server (j'ai supposé qu'ils étaient les mêmes quand j'ai écrit la question).

MISE A JOUR == 2 ==

petelids donne la réponse ci-dessous, en utilisant par exemple Liste <System.Data.SqlGuid> .Sort() donne la séquence suivante (à l'aide d'une première liste de GUID avec un 1 à chaque emplacement de 4 bits) ...

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 

Par opposition à l'ordre suivant renvoyé par liste <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

Ce qui est "un peu inhabituel"? Comment pouvons-nous suggérer quelque chose sans savoir comment les commander? – DavidG

+0

pas une bonne idée de commander guid – CarbineCoder

+2

@CarbineCoder: Sans aucun contexte, cette déclaration est absurde. Si vous utilisez des GUID comme ID, la commande d'éléments par ces GUID permet une recherche plus rapide, par exemple. –

Répondre

6

Il y a une différence entre la façon dont le serveur Sql et GUIDs de tri .NET.

Il existe une structure dans le framework .NET appelée SqlGuid qui devrait se comporter de la même manière que guids dans Sql Server.

Prenons l'exemple suivant adapté de 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); 
} 

Ceci produit la sortie:

--Unsorted Guids--
3aaaaaaa-bbbb-cccc-dddd-2eeeeeeeeeee
2aaaaaaa -bbbb-cccc-dddd-1eeeeeeeeeee
1aaaaaaa-bbbb-cccc-dddd-3eeeeeeeeeee
--coupe Guids--
1aaaaaaa-bbbb-cccc-dddd-3eeeeeeeeeee
2aaaaaaa-bbbb-cccc-dddd-1eeeeeeeeeee
3aaaaaaa-bbbb-cccc-dddd-2eeeeeeeeeee

--Sorted SqlGuids-- 2aaaaaaa-bbbb- cccc-dddd-1eeeeeeeeeee
3aaaaaaa-bbbb-cccc-dddd-2eeeeeeeeeee
1aaaaaaa-bbbb-cccc-dddd-3eeeeeeeeeee

la classe SqlGuid a un constructeur qui prend un Guid et la coulée de l'un à l'autre aussi w orks donc la conversion entre eux devrait être assez facile.Ajouter ce qui suit au code ci-dessus par exemple:

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); 
} 

Ajoute la sortie:

SqlGuids --Sorted 2--
2aaaaaaa-bbbb-cccc-dddd-1eeeeeeeeeee
3aaaaaaa-bbbb -cccc-dddd-2eeeeeeeeeee
1aaaaaaa-bbbb-cccc-dddd-3eeeeeeeeeee