myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Gemeinschaft » .NET-Komponenten und C#-Snippets » Hierarchy-Struct ähnlich SqlHierarchyId
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Hierarchy-Struct ähnlich SqlHierarchyId

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
jaensen jaensen ist männlich
myCSharp.de-Poweruser/ Experte

avatar-2657.png


Dabei seit: 15.12.2006
Beiträge: 2.760
Entwicklungsumgebung: VS 2013
Herkunft: München


jaensen ist offline

Hierarchy-Struct ähnlich SqlHierarchyId

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Beschreibung:
Ich musste neulich ein paar Datensätze unter Beachtung der ihrer Hierarchie sortieren und brauchte dafür einen kleinen Helfer den ich hier gerne zur Verfügung stelle:

C#-Code:
        public struct Hierarchy : IComparable
        {
            private int[] _parts;

            public Hierarchy(string path, string seperator = "/")
            {
                if (path == null)
                    throw new ArgumentNullException("path");
                if (seperator == null)
                    throw new ArgumentNullException("seperator");

                string[] pathParts = path.Split(new string[] { seperator }, StringSplitOptions.RemoveEmptyEntries);
                _parts = new int[pathParts.Length];

                for (int i = 0; i < pathParts.Length; i++)
                {
                    int parsed = 0;
                    if (!int.TryParse(pathParts[i], out parsed))
                        throw new Exception("The input path has the wrong format. Allowed format is: /int/int/int or int/int/int");

                    _parts[i] = parsed;
                }
            }

            public static bool operator >(Hierarchy h1, Hierarchy h2)
            {
                int l = h1._parts.Length >= h2._parts.Length ? h1._parts.Length : h2._parts.Length;

                for (int i = 0; i < l; i++)
                {
                    if (i > h1._parts.Length - 1 || i > h2._parts.Length - 1)
                        break;

                    int v1 = h1._parts[i];
                    int v2 = h2._parts[i];

                    if (v1 == v2)
                        continue;

                    return v1 > v2;
                }

                return false;
            }

            public static bool operator <(Hierarchy h1, Hierarchy h2)
            {
                int l = h1._parts.Length >= h2._parts.Length ? h1._parts.Length : h2._parts.Length;

                for (int i = 0; i < l; i++)
                {
                    if (i > h1._parts.Length - 1 || i > h2._parts.Length - 1)
                        break;

                    int v1 = h1._parts[i];
                    int v2 = h2._parts[i];

                    if (v1 == v2)
                        continue;

                    return v1 < v2;
                }

                return false;
            }

            public static bool operator ==(Hierarchy h1, Hierarchy h2)
            {
                if (h1._parts.Length != h2._parts.Length)
                    return false;

                for (int i = 0; i < h1._parts.Length; i++)
                {
                    if (h1._parts[i] != h2._parts[i])
                        return false;
                }

                return true;
            }

            public static bool operator !=(Hierarchy h1, Hierarchy h2)
            {
                if (h1._parts.Length != h2._parts.Length)
                    return true;

                for (int i = 0; i < h1._parts.Length; i++)
                {
                    if (h1._parts[i] == h2._parts[i])
                        return false;
                }

                return true;
            }

            public int CompareTo(object obj)
            {
                if (!(obj is Hierarchy))
                    return 1;

                Hierarchy h = (Hierarchy)obj;
                if (h > this)
                    return 1;
                else if (h < this)
                    return -1;
                else
                    return 0;
            }

            public override bool Equals(object obj)
            {
                if (!(obj is Hierarchy))
                    return false;

                Hierarchy h = (Hierarchy)obj;
                return h == this;
            }

            public override int GetHashCode()
            {
                unchecked
                {
                    int hash = 0;
                    for (int i = 0; i < _parts.Length; i++)
                    {
                        hash = i ^ _parts[i] + hash;
                    }
                    return hash;
                }
            }
        }

Verwendung läuft folgendermaßen:

C#-Code:
            Hierarchy h1 = new Hierarchy("/123/123/123/123/123/123");
            Hierarchy h2 = new Hierarchy("123/123/123/123/123/123");
            Hierarchy h3 = new Hierarchy("123/123/123/123/123/123/");

            // h1 == h2 = true
            // h2 == h3 = true

           Hierarchy h4 = new Hierarchy(".123.123.123.123.123.123", ".");
           // h3 == h4 = true

Schlagwörter: Hierarchie, Baum, Tree, sortieren, Sortierung

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von jaensen am 16.10.2013 14:42.

16.10.2013 14:40 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 7 Jahre.
Der letzte Beitrag ist älter als 7 Jahre.
Antwort erstellen


© Copyright 2003-2021 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 20.01.2021 08:35