Frage

Ist die HashSet Sammlung eingeführt in NET 3.5 Einsetzfolge erhalten bei Verwendung von foreach iteriert?

Die Dokumentation Staaten, dass die Sammlung nicht sortiert, sondern es sagt nichts über Auftrag. A Pre-Release-BCL Blogeintrag besagt, dass es ungeordnete, aber diesem Artikel besagt, dass es konzipiert ist Insertion zu erhalten Bestellung. Meine beschränkten Tests vermuten lassen, dass Ordnung erhalten bleibt, aber das könnte ein Zufall sein.

War es hilfreich?

Lösung

Diese HashSet MSDN-Seite speziell sagt:

  

Ein Satz ist eine Sammlung, die keine doppelte Elemente enthält, und deren Elemente in keiner bestimmten Reihenfolge.

Andere Tipps

Ich denke, der Artikel behauptet, es Ordnung bewahrt einfach falsch ist. Für einfache Tests kann auch der Auftrag aufgrund der inneren Struktur beibehalten werden, aber es ist nicht garantiert und wird nicht immer so. Ich werde versuchen, mit einem Gegenbeispiel zu kommen.

EDIT: Hier ist das Gegenbeispiel:

using System;
using System.Collections.Generic;

class Test
{
    static void Main()
    {
        var set = new HashSet<int>();

        set.Add(1);
        set.Add(2);
        set.Add(3);
        set.Remove(2);
        set.Add(4);


        foreach (int x in set)
        {
            Console.WriteLine(x);
        }
    }
}

Dies druckt 1, 4, 3 trotz 3 vor 4 eingesetzt wurde.

Es ist möglich , wenn Sie nie irgendwelche Gegenstände entfernen, wird es Auftrag erhalten. Ich bin nicht sicher, aber ich würde nicht völlig überrascht. Aber ich denke, es ist eine sehr schlechte Idee wäre, sich auf das verlassen:

  • Es ist nicht dokumentiert, so zu arbeiten, und die Dokumentation ausdrücklich, dass es nicht sortiert ist.
  • Ich habe nicht an den internen Strukturen oder Quellcode sah (was ich nicht habe, offensichtlich.) - Ich muss sie in einer festen Art und Weise für eine solche Forderung sorgfältig studieren würde, bevor Sie
  • Die Implementierung sehr einfach zwischen Versionen des Frameworks ändern könnte. Unter Berufung auf diese wäre wie unter Berufung auf der string.GetHashCode Implementierung nicht zu ändern - die einige Leute in den .NET 1,1 Tagen taten zurück, und dann wurde sie verbrannt, wenn die Umsetzung hat in .NET 2.0 ändern ...

In der Dokumentation:

  

Ein HashSet <(Of <(T>)>) Sammlung nicht sortiert ist und keine doppelten Elemente enthalten kann. Wenn Auftrag oder Element Vervielfältigung wichtiger als Leistung für Ihre Anwendung ist, sollten Sie die Liste mit <(Of <(T>)>) -Klasse zusammen mit der Sort-Methode.

Deshalb spielt es keine Rolle, ob es sich tatsächlich um die Reihenfolge der Elemente in der aktuellen Implementierung bewahrt, weil sie als dabei nicht dokumentiert ist, und auch wenn es scheint, jetzt kann dies in Zukunft an jedem Punkt geändert wird (auch in ein Hotfix auf den Rahmen).

Sie sollten werden Programmierung gegen dokumentiert Verträge , nicht Implementierungsdetails .

Es ist speziell eine SortedSet<T> Sammlung in .NET4 .

Dies würde Ihnen Sortierung, aber unwahrscheinlich Auftrag Sortierung sein. Da Sie eine benutzerdefinierte IComparer verwenden können, könnten Sie theoretisch das etwas machen tun.

Nein, ein Hash-Set nicht Einsetzfolge, zumindest nicht vorhersagbar bewahren. Sie könnten eine LinkedHashSet (Java) oder eine gleichwertige verwenden. Ein LinkedHashSet wird Auftrag erhalten.

Wenn Sie bestellen möchten, sollten Sie nicht einmal einen Satz an erster Stelle werden mit ... es ist nicht für geordnete Elementen, außer in Ausnahmefällen.

EDIT: klingt wie ich predige: - /. Es tut uns Leid

Lesen Sie den Quellcode für HashSet.AddIfNotPresent Auftrag erhalten wird sehen können annehmend hat es keine Streichungen gewesen .

So new HashSet<string> { "Tom", "Dick", "Harry" } bewahrt Ordnung, aber wenn man dann Dick entfernen und Rick hinzufügen, wird die Bestellung sein [ "Tom", "Rick", "Harry"].

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top