Avatar billede Slettet bruger
17. april 2008 - 16:36 Der er 10 kommentarer og
1 løsning

Sortere List<XmlNode> efter bestemt værdi i noderne?

Ello!

Hvordan kan jeg sortere noderne i en List<XmlNode> ud fra en værdi i noderne? F.eks. så de noder hvor egenskaben 'time' som long er mindst kommer først.
Avatar billede driis Nybegynder
17. april 2008 - 17:44 #1
Bruger du C# 3.5 ? I så fald lyder det som noget LINQ ville kunne klare med orderby clausen.
Avatar billede Slettet bruger
17. april 2008 - 18:01 #2
Ja, jeg bruger 3.5. Hvad er LINQ, og hvordan bruger jeg det i denne sammenhæng?
Et eksempel vil blive værdsat :)
Avatar billede driis Nybegynder
17. april 2008 - 18:22 #3
LINQ er nyt i .NET 3.5 / C# 3.0, og gør det muligt at lave dataudvælgelse nemmere end før, ved at indføre nogle SQL-agtige funktionaliteter (meget kortfattet - se mere her: http://en.csharp-online.net/Introducing_LINQ%E2%80%94What_Is_LINQ)

Flg. eksempel viser hvordan du ville kunne bruge orderby i et LINQ statement:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml;

namespace TestSort
{
    class Program
    {
        private static Random rand = new Random();
        static void Main(string[] args)
        {
            XmlDocument doc = new XmlDocument();
            doc.LoadXml("<root />");
            for (int i = 0; i < 50; i++)
                AddRandomNode(doc);

            XmlNodeList list = doc.SelectNodes("/root/node");
            Console.WriteLine("Unsorted:");
            PrintNodes(list.Cast<XmlNode>());

            Console.WriteLine("\nSorted:");
            var sorted = from node in list.Cast<XmlNode>()                       
                        orderby Convert.ToInt32(node.Attributes["time"].Value) ascending
                        select node;
            PrintNodes(sorted);
        }

        private static void PrintNodes(IEnumerable<XmlNode> nodes)
        {
            foreach (var node in nodes)
                Console.WriteLine(node.Attributes["time"].Value);
        }

        private static void AddRandomNode(XmlDocument doc)
        {
            XmlElement node = doc.CreateElement("node");
            XmlAttribute att = doc.CreateAttribute("time");
            att.Value = rand.Next(1000).ToString();
            node.Attributes.Append(att);
            doc.DocumentElement.AppendChild(node);
        }
    }
}
Avatar billede Slettet bruger
17. april 2008 - 18:38 #4
Hmm... Det virker lidt forvirrende, så måske kan jeg få dig til at pille den essentielle del ud? Hvordan kan jeg f.eks. enklest skrive en funktion, der kun sorterer et XmlDocument uden en masse anden kode?

public XmlDocument SortXml(XmlDocument source)
{
    // Her
    return retultatet;
}

Jeg er stadig lidt noobet til C#.
Avatar billede driis Nybegynder
17. april 2008 - 18:41 #5
Det er jo lidt noget andet. Dvs. du vil have sorteret noderne direkte i XmlDocument'et ?
Hvad skal det bruges til ?

Den essentielle linie i eksemplet er:
var sorted = from node in list.Cast<XmlNode>()                     
                        orderby Convert.ToInt32(node.Attributes["time"].Value) ascending
                        select node;
Avatar billede Slettet bruger
17. april 2008 - 18:49 #6
Jeg er ved at skrive en kalender og har brug for at få sorteret alle noter efter dato. Det letteste er derfor simpelthen at sortere List'en med samtlige noter, inden de hentes af selve Form'en og vises til brugeren.
Og lige et spørgsmål: Hvad er 'var' i 'var sorted'? En generisk type?
Avatar billede driis Nybegynder
17. april 2008 - 18:54 #7
Jeg tror det nemmeste for dig er at trække en liste ud og anvende den videre hen. Altså således at SortXml returnerer en liste af noder, som er sorteret ? Det kan godt lade sig gøre at sortere noderne inde i XML dokumentet og sende det videre, men det er lidt bøvlet.

"var" er en implicit typed variabel. Dvs. at man ikke selv behøver at skrive typen, men compileren udleder det selv udfra udtrykket på højre side af lighedstegnet.
Avatar billede Slettet bruger
17. april 2008 - 18:56 #8
Okay, så jeg skulle have en funktion som
XmlDocument Noget(XmlDocument param)
{ return XmlDocument sorted; }
?

Og hvordan henter jeg et XmlDocument fra 'var sorted' i
var sorted = from node in list.Cast<XmlNode>() orderby convert.ToInt32(node.Attributes["time"].Value) ascending select node;
?
Avatar billede kalp Novice
17. april 2008 - 21:16 #9
hvis du bare skal sortere så kan du gøre sådan her.

kode:

      List<XmlNode> list = new List<XmlNode>();
            XmlDocument xml = new XmlDocument();
            xml.LoadXml(@"<root>
                            <node date=""2008-04-11""/>
                            <node date=""2008-04-16""/>
                            <node date=""2008-04-15""/>
                            <node date=""2008-04-12""/>
                            <node date=""2008-04-14""/>
                            <node date=""2008-04-17""/>
                          </root>");
            XmlNodeList nodes = xml.SelectNodes("/root/node");
            foreach (XmlNode node in nodes)
            {
                list.Add(node);
            }
            list.Sort(Compare);

og denne metode skal du lave

      public int Compare(XmlNode nodeOne, XmlNode nodeTwo)
        {
            if (DateTime.Parse(nodeOne.Attributes["date"].Value) < DateTime.Parse(nodeTwo.Attributes["date"].Value))
                return -1;
            if (DateTime.Parse(nodeOne.Attributes["date"].Value) > DateTime.Parse(nodeTwo.Attributes["date"].Value))
                return 1;
            return 0;
        }
Avatar billede Slettet bruger
17. april 2008 - 21:19 #10
Bingo :) Det er lige det, jeg har brug for.
Hvordan kan det være, kalp altid rammer lige det, jeg leder efter...?
Anyway, I må dele pointene, når jeg lige får det testet. Jeg skriver tilbage snart.
Avatar billede Slettet bruger
02. maj 2008 - 10:00 #11
Nå. Det bliver til driis.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester