C# - byte-array-Vergleich
Habe ich zwei byte-arrays, die in C# mit .NET 3.0.
Was ist der "effizienteste" Weg, um zu vergleichen, ob zwei byte-arrays enthält den gleichen Inhalt für jedes element?
Z. B. byte-array {0x1, 0x2}
ist das gleiche wie {0x1, 0x2}
. Aber byte-array {0x1, 0x2}
- und byte-array {0x2, 0x1}
sind nicht das gleiche.
Duplikat von stackoverflow.com/questions/43289
InformationsquelleAutor George2 | 2009-09-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut, Sie könnte verwenden:
(Ich verwende normalerweise Klammern für alles, aber ich dachte, ich würde Experimentieren mit diesem layout-Stil nur für einen Wechsel...)
Dieser hat ein paar Optimierungen, die
SequenceEqual
können nicht (oder nicht) führen - wie die up-front-Länge überprüfen. Direkter Zugriff auf Arrays wird auch ein bisschen effizienter als die Verwendung des Enumerators.Zugegeben, es ist unwahrscheinlich, dass einen signifikanten Unterschied in den meisten Fällen...
Könnte man möglicherweise damit es schneller geht, die in nicht verwaltetem code, indem Sie es vergleichen, 32 oder 64 bits zu einer Zeit statt 8 - aber ich möchte nicht auf code, der on-the-fly.
Hey Jon, arbeiten Sie für stackoverflow ?
NÖ, ich arbeite für Google.
Für große arrays, sagen wir 10k, würde Parallelisierung eine effiziente Optimierung oder würde der threading-overhead sein, zu viel?
Ich gestehe, ich habe nie ganz verstanden
IStructuralEquatable
und, wenn es angemessen ist.InformationsquelleAutor Jon Skeet
Können Sie die
SequenceEqual
Methode:Wie bereits erwähnt in den Kommentaren,
SequenceEqual
erfordert .NET 3.5 (oder LINQBridge wenn Sie mit VS2008 und Ausrichtung einer früheren version des Frameworks).Nicht in Bezug auf die Ausführungszeit ist es nicht.
Es ist sicherlich der am wenigsten Tippen! Siehe Jon ' s Antwort für ein paar zusätzliche Optimierungen.
(Versuchen Sie vergleicht ein byte-array mit 1.000.000 Einträgen mit einem mit 1,000,001 Einträge über SequenceEqual. Es wird gehen Sie nach rechts bis zum Ende, bevor die bemerken, dass Sie unterschiedliche Längen haben...)
Auch das geht nicht (ohne etwas wie LINQBridge).NET 3.0 als erforderlich in der Frage... es ist zwar möglich, dass der OP meinte .NET 3.5.
InformationsquelleAutor LukeH
Jon genannten Vergleich mehrerer bytes auf einmal mit unsicherem code, also musste ich give it a go:
Den safe-code wird ziemlich optimiert (der compiler weiß, dass Sie nicht haben, um zu überprüfen, index-Grenzen Beispiel), so würde ich nicht erwarten, dass der unsichere code sehr viel schneller. Kein signifikanter Unterschied von der Fähigkeit zu vergleichen, die mehrere bytes auf einmal.
Brey: Sie sind richtig, das wird nicht funktionieren. Sie müssen erklären, neue Zeiger innerhalb des Blocks haben Sie veränderbar. Ich habe korrigiert den code.
Es ist schneller zu bedienen Long (8 Byte) in den comp, auch auf 32bit Maschinen.
InformationsquelleAutor Guffa
Wenn Sie nicht zu besorgt über die Leistung, die Sie betrachten können
IStructuralEquatable
..NET Framework Unterstützt in: 4.5, 4
Beispiel:
REFERENZ
InformationsquelleAutor Lijo
Wenn Sie wollen, dass es wirklich schnell sein, können Sie mit unsicherer code (das ist nicht immer möglich):
InformationsquelleAutor Philippe Leybaert