Results 1 to 8 of 8

Thread: Linq to Xml sorting

  1. #1

    Thread Starter
    Addicted Member
    Join Date
    Jan 2013
    Posts
    177

    Linq to Xml sorting

    Hey,

    I am attempting to sort an xml file by 2 variables the Signal name and the Size, here is what I have tried so far

    vb.net Code:
    1. Dim wiredatas = From n In doc.<Data>.<WireData>.<Signal_Name> Order By CStr([email protected]())

    Which gives me the data sorted like so

    Code:
    Signal : 1051 Size : AWG 10
    Signal : 1052 Size : AWG 10
    Signal : 1053 Size : AWG 10
    Signal : 1071 Size : AWG 10
    Signal : 1071 Size : AWG 10
    Signal : 1072 Size : AWG 16
    Signal : 1073 Size : AWG 14
    Signal : 1073 Size : AWG 14
    Signal : 1081 Size : AWG 10
    Signal : 1081 Size : AWG 10
    Signal : 1082 Size : AWG 16
    Signal : 1083 Size : AWG 14
    Signal : 1083 Size : AWG 14
    Signal : 1091 Size : AWG 10
    Signal : 1091 Size : AWG 10
    Signal : 1092 Size : AWG 10
    Signal : 1093 Size : AWG 10
    Signal : 1093 Size : AWG 10
    Signal : 1141 Size : AWG 10
    Signal : 1151 Size : AWG 16
    Signal : 1151 Size : AWG 14
    Signal : 1151 Size : AWG 14
    Signal : 1171 Size : AWG 18
    Signal : 1171 Size : AWG 18
    Signal : 1171 Size : AWG 18
    Signal : 1171 Size : AWG 18
    Signal : 1171 Size : AWG 18
    Signal : 1171 Size : AWG 18
    Signal : 1171 Size : AWG 18
    Signal : 1171 Size : AWG 16
    Signal : 1171 Size : AWG 18
    Signal : 1171 Size : AWG 18
    Signal : 1171 Size : AWG 18
    Signal : 1171 Size : AWG 18
    Signal : 1171 Size : AWG 18
    Signal : 1182 Size : AWG 16
    Signal : 1182 Size : AWG 14
    Signal : 1182 Size : AWG 14
    Signal : 1182 Size : AWG 14
    Signal : 1221 Size : AWG 18
    Signal : 1221 Size : AWG 18
    Signal : 1221 Size : AWG 18
    Signal : 1221 Size : AWG 18
    Signal : 1221 Size : AWG 18
    Signal : 1221 Size : AWG 18
    Signal : 1221 Size : AWG 18
    Signal : 1221 Size : AWG 18
    Signal : 1221 Size : AWG 18
    Signal : 1221 Size : AWG 16
    Signal : 1221 Size : AWG 18
    Signal : 1221 Size : AWG 16
    Signal : 1221 Size : AWG 18
    Signal : 1221 Size : AWG 18
    Signal : 1221 Size : AWG 18
    Signal : 2082 Size : AWG 10
    Signal : 2082 Size : AWG 10
    Signal : 2082 Size : AWG 10
    Signal : 2091 Size : AWG 2/0
    Signal : 2092 Size : AWG 2/0
    Signal : 2092 Size : AWG 10
    Signal : 2092 Size : AWG 10
    Signal : 2092 Size : AWG 10
    Signal : 2093 Size : AWG 10
    Signal : 2121 Size : AWG 18
    Signal : 2191 Size : AWG 10
    Signal : 2201 Size : AWG 10
    Signal : 2241 Size : AWG 18
    Signal : 4021 Size : AWG 18
    Signal : 4022 Size : AWG 18
    Signal : 4031 Size : AWG 18
    Signal : 4032 Size : AWG 18
    Signal : 4053 Size : AWG 18
    Signal : 4061 Size : AWG 18
    Signal : 4081 Size : AWG 18
    Signal : 4091 Size : AWG 18
    Signal : 4101 Size : AWG 18
    Signal : 4101 Size : AWG 18
    Signal : 4101 Size : AWG 18
    Signal : 4111 Size : AWG 18
    Signal : 4111 Size : AWG 18
    Signal : 4112 Size : AWG 18
    Signal : 4113 Size : AWG 18
    Signal : 4114 Size : AWG 18
    Signal : 4192 Size : AWG 18
    Signal : 4192 Size : AWG 18
    Signal : 4193 Size : AWG 18
    Signal : 4193 Size : AWG 18
    Signal : 4236 Size : AWG 18
    Signal : 4267 Size : AWG 18
    Signal : 4267 Size : AWG 18
    Signal : 4268 Size : AWG 18
    Signal : 5021 Size : AWG 18
    Signal : 7071 Size : AWG 18
    Signal : 7072 Size : AWG 18
    Signal : 7072 Size : AWG 18
    Signal : 7082 Size : AWG 18
    Signal : 7083 Size : AWG 18
    Signal : 7084 Size : AWG 18
    Signal : 7101 Size : AWG 18
    Signal : 7102 Size : AWG 18
    Signal : 7103 Size : AWG 18
    Signal : 7104 Size : AWG 18
    Signal : 7131 Size : AWG 18
    Signal : 7132 Size : AWG 18
    Signal : 7133 Size : AWG 18
    Signal : 7134 Size : AWG 18
    Signal : 7161 Size : AWG 18
    Signal : 7192 Size : AWG 18
    Signal : GND Size : AWG 10
    Signal : GND Size : AWG 10
    Signal : GND Size : AWG 10
    Signal : GND Size : AWG 10
    Signal : GND Size : AWG 10
    Signal : GND Size : AWG 10
    Signal : GND Size : AWG 10

    and I tried this

    vb.net Code:
    1. Dim wiredatas = From n In doc.<Data>.<WireData>.<Signal_Name> Order By CStr([email protected]()), CStr(n.<Size>.Value.First())

    and I gets this

    Code:
    Signal : 1051 Size : AWG 10
    Signal : 1052 Size : AWG 10
    Signal : 1053 Size : AWG 10
    Signal : 1071 Size : AWG 10
    Signal : 1071 Size : AWG 10
    Signal : 1072 Size : AWG 16
    Signal : 1073 Size : AWG 14
    Signal : 1073 Size : AWG 14
    Signal : 1081 Size : AWG 10
    Signal : 1081 Size : AWG 10
    Signal : 1082 Size : AWG 16
    Signal : 1083 Size : AWG 14
    Signal : 1083 Size : AWG 14
    Signal : 1091 Size : AWG 10
    Signal : 1091 Size : AWG 10
    Signal : 1092 Size : AWG 10
    Signal : 1093 Size : AWG 10
    Signal : 1093 Size : AWG 10
    Signal : 1141 Size : AWG 10
    Signal : 1151 Size : AWG 16
    Signal : 1151 Size : AWG 14
    Signal : 1151 Size : AWG 14
    Signal : 1171 Size : AWG 18
    Signal : 1171 Size : AWG 18
    Signal : 1171 Size : AWG 18
    Signal : 1171 Size : AWG 18
    Signal : 1171 Size : AWG 18
    Signal : 1171 Size : AWG 18
    Signal : 1171 Size : AWG 18
    Signal : 1171 Size : AWG 16
    Signal : 1171 Size : AWG 18
    Signal : 1171 Size : AWG 18
    Signal : 1171 Size : AWG 18
    Signal : 1171 Size : AWG 18
    Signal : 1171 Size : AWG 18
    Signal : 1182 Size : AWG 16
    Signal : 1182 Size : AWG 14
    Signal : 1182 Size : AWG 14
    Signal : 1182 Size : AWG 14
    Signal : 1221 Size : AWG 18
    Signal : 1221 Size : AWG 18
    Signal : 1221 Size : AWG 18
    Signal : 1221 Size : AWG 18
    Signal : 1221 Size : AWG 18
    Signal : 1221 Size : AWG 18
    Signal : 1221 Size : AWG 18
    Signal : 1221 Size : AWG 18
    Signal : 1221 Size : AWG 18
    Signal : 1221 Size : AWG 16
    Signal : 1221 Size : AWG 18
    Signal : 1221 Size : AWG 16
    Signal : 1221 Size : AWG 18
    Signal : 1221 Size : AWG 18
    Signal : 1221 Size : AWG 18
    Signal : 2082 Size : AWG 10
    Signal : 2082 Size : AWG 10
    Signal : 2082 Size : AWG 10
    Signal : 2091 Size : AWG 2/0
    Signal : 2092 Size : AWG 2/0
    Signal : 2092 Size : AWG 10
    Signal : 2092 Size : AWG 10
    Signal : 2092 Size : AWG 10
    Signal : 2093 Size : AWG 10
    Signal : 2121 Size : AWG 18
    Signal : 2191 Size : AWG 10
    Signal : 2201 Size : AWG 10
    Signal : 2241 Size : AWG 18
    Signal : 4021 Size : AWG 18
    Signal : 4022 Size : AWG 18
    Signal : 4031 Size : AWG 18
    Signal : 4032 Size : AWG 18
    Signal : 4053 Size : AWG 18
    Signal : 4061 Size : AWG 18
    Signal : 4081 Size : AWG 18
    Signal : 4091 Size : AWG 18
    Signal : 4101 Size : AWG 18
    Signal : 4101 Size : AWG 18
    Signal : 4101 Size : AWG 18
    Signal : 4111 Size : AWG 18
    Signal : 4111 Size : AWG 18
    Signal : 4112 Size : AWG 18
    Signal : 4113 Size : AWG 18
    Signal : 4114 Size : AWG 18
    Signal : 4192 Size : AWG 18
    Signal : 4192 Size : AWG 18
    Signal : 4193 Size : AWG 18
    Signal : 4193 Size : AWG 18
    Signal : 4236 Size : AWG 18
    Signal : 4267 Size : AWG 18
    Signal : 4267 Size : AWG 18
    Signal : 4268 Size : AWG 18
    Signal : 5021 Size : AWG 18
    Signal : 7071 Size : AWG 18
    Signal : 7072 Size : AWG 18
    Signal : 7072 Size : AWG 18
    Signal : 7082 Size : AWG 18
    Signal : 7083 Size : AWG 18
    Signal : 7084 Size : AWG 18
    Signal : 7101 Size : AWG 18
    Signal : 7102 Size : AWG 18
    Signal : 7103 Size : AWG 18
    Signal : 7104 Size : AWG 18
    Signal : 7131 Size : AWG 18
    Signal : 7132 Size : AWG 18
    Signal : 7133 Size : AWG 18
    Signal : 7134 Size : AWG 18
    Signal : 7161 Size : AWG 18
    Signal : 7192 Size : AWG 18
    Signal : GND Size : AWG 10
    Signal : GND Size : AWG 10
    Signal : GND Size : AWG 10
    Signal : GND Size : AWG 10
    Signal : GND Size : AWG 10
    Signal : GND Size : AWG 10
    Signal : GND Size : AWG 10

    In theory the 2nd try should work, I want it so that the signals are the primary and then the size is arranged in order within the signal... so

    instead of

    Code:
    Signal : 1221 Size : AWG 18
    Signal : 1221 Size : AWG 18
    Signal : 1221 Size : AWG 16
    Signal : 1221 Size : AWG 18
    Signal : 1221 Size : AWG 16
    Signal : 1221 Size : AWG 18
    Signal : 1221 Size : AWG 18
    Signal : 1221 Size : AWG 18


    The Size AWG 16 should either be first or last and not in between, I do not know why it does not catch that ? :S

  2. #2
    eXtreme Programmer .paul.'s Avatar
    Join Date
    May 2007
    Location
    Chelmsford UK
    Posts
    26,415

    Re: Linq to Xml sorting

    try this:

    Code:
    Dim wiredatas = From n In doc.<Data>.<WireData>.<Signal_Name> Order By CInt(n.@Signal), CInt(n.<Size>.Value.Replace("AWG ", ""))

  3. #3

    Thread Starter
    Addicted Member
    Join Date
    Jan 2013
    Posts
    177

    Re: Linq to Xml sorting

    Quote Originally Posted by .paul. View Post
    try this:

    Code:
    Dim wiredatas = From n In doc.<Data>.<WireData>.<Signal_Name> Order By CInt(n.@Signal), CInt(n.<Size>.Value.Replace("AWG ", ""))
    The only thing is, some of the wires are "AWG 2/0"

    Will put together a quick function that gets just the numeric values I suppose! GOnna try it thanks!

    EDIT: Really Close!

    vb.net Code:
    1. Dim wiredatas = From n In doc.<Data>.<WireData>.<Signal_Name> Order By CStr([email protected]()), CStr(GetNumber(n.<Size>.Value.Substring(3)))

    For some reason, they are still apart. It does not make sense why the bolded ones are seperated

    Code:
    Signal : 1051 Size : AWG 10
    Signal : 1052 Size : AWG 10
    Signal : 1053 Size : AWG 10
    Signal : 1071 Size : AWG 10
    Signal : 1071 Size : AWG 10
    Signal : 1081 Size : AWG 10
    Signal : 1081 Size : AWG 10
    Signal : 1091 Size : AWG 10
    Signal : 1091 Size : AWG 10
    Signal : 1092 Size : AWG 10
    Signal : 1093 Size : AWG 10
    Signal : 1093 Size : AWG 10
    Signal : 1141 Size : AWG 10
    Signal : 1073 Size : AWG 14
    Signal : 1073 Size : AWG 14
    Signal : 1083 Size : AWG 14
    Signal : 1083 Size : AWG 14
    Signal : 1151 Size : AWG 14
    Signal : 1151 Size : AWG 14
    Signal : 1182 Size : AWG 14
    Signal : 1182 Size : AWG 14
    Signal : 1182 Size : AWG 14
    Signal : 1072 Size : AWG 16
    Signal : 1082 Size : AWG 16
    Signal : 1151 Size : AWG 16
    Signal : 1171 Size : AWG 16
    Signal : 1182 Size : AWG 16
    Signal : 1221 Size : AWG 16
    Signal : 1221 Size : AWG 16
    Signal : 1171 Size : AWG 18
    Signal : 1171 Size : AWG 18
    Signal : 1171 Size : AWG 18
    Signal : 1171 Size : AWG 18
    Signal : 1171 Size : AWG 18
    Signal : 1171 Size : AWG 18
    Signal : 1171 Size : AWG 18
    Signal : 1171 Size : AWG 18
    Signal : 1171 Size : AWG 18
    Signal : 1171 Size : AWG 18
    Signal : 1171 Size : AWG 18
    Signal : 1171 Size : AWG 18
    Signal : 1221 Size : AWG 18
    Signal : 1221 Size : AWG 18
    Signal : 1221 Size : AWG 18
    Signal : 1221 Size : AWG 18
    Signal : 1221 Size : AWG 18
    Signal : 1221 Size : AWG 18
    Signal : 1221 Size : AWG 18
    Signal : 1221 Size : AWG 18
    Signal : 1221 Size : AWG 18
    Signal : 1221 Size : AWG 18
    Signal : 1221 Size : AWG 18
    Signal : 1221 Size : AWG 18
    Signal : 1221 Size : AWG 18
    Signal : 2091 Size : AWG 2/0
    Signal : 2092 Size : AWG 2/0
    Signal : 2082 Size : AWG 10
    Signal : 2082 Size : AWG 10
    Signal : 2082 Size : AWG 10
    Signal : 2092 Size : AWG 10
    Signal : 2092 Size : AWG 10
    Signal : 2092 Size : AWG 10
    Signal : 2093 Size : AWG 10
    Signal : 2191 Size : AWG 10
    Signal : 2201 Size : AWG 10
    Signal : 2121 Size : AWG 18
    Signal : 2241 Size : AWG 18
    Signal : 4021 Size : AWG 18
    Signal : 4022 Size : AWG 18
    Signal : 4031 Size : AWG 18
    Signal : 4032 Size : AWG 18
    Signal : 4053 Size : AWG 18
    Signal : 4061 Size : AWG 18
    Signal : 4081 Size : AWG 18
    Signal : 4091 Size : AWG 18
    Signal : 4101 Size : AWG 18
    Signal : 4101 Size : AWG 18
    Signal : 4101 Size : AWG 18
    Signal : 4111 Size : AWG 18
    Signal : 4111 Size : AWG 18
    Signal : 4112 Size : AWG 18
    Signal : 4113 Size : AWG 18
    Signal : 4114 Size : AWG 18
    Signal : 4192 Size : AWG 18
    Signal : 4192 Size : AWG 18
    Signal : 4193 Size : AWG 18
    Signal : 4193 Size : AWG 18
    Signal : 4236 Size : AWG 18
    Signal : 4267 Size : AWG 18
    Signal : 4267 Size : AWG 18
    Signal : 4268 Size : AWG 18
    Signal : 5021 Size : AWG 18
    Signal : 7071 Size : AWG 18
    Signal : 7072 Size : AWG 18
    Signal : 7072 Size : AWG 18
    Signal : 7082 Size : AWG 18
    Signal : 7083 Size : AWG 18
    Signal : 7084 Size : AWG 18
    Signal : 7101 Size : AWG 18
    Signal : 7102 Size : AWG 18
    Signal : 7103 Size : AWG 18
    Signal : 7104 Size : AWG 18
    Signal : 7131 Size : AWG 18
    Signal : 7132 Size : AWG 18
    Signal : 7133 Size : AWG 18
    Signal : 7134 Size : AWG 18
    Signal : 7161 Size : AWG 18
    Signal : 7192 Size : AWG 18
    Signal : GND Size : AWG 10
    Signal : GND Size : AWG 10
    Signal : GND Size : AWG 10
    Signal : GND Size : AWG 10
    Signal : GND Size : AWG 10
    Signal : GND Size : AWG 10
    Signal : GND Size : AWG 10
    Last edited by Crzyrio; May 24th, 2013 at 08:56 AM.

  4. #4
    Frenzied Member IanRyder's Avatar
    Join Date
    Jan 2013
    Location
    Healing, UK
    Posts
    1,232

    Re: Linq to Xml sorting

    Hi,

    Since you did not provide an example of the structure of your XML file I have created an assumed XML file in the form of:-

    HTML Code:
    <?xml version="1.0" standalone="true"?>
    <DocumentElement>
      <myXMLFile>
        <Signal>Signal : 1051</Signal>
        <Size>Size : AWG 10</Size>
      </myXMLFile>
      <myXMLFile>
        <Signal>Signal : 1052</Signal>
        <Size>Size : AWG 10</Size>
      </myXMLFile>
      <myXMLFile>
        <Signal>Signal : 1053</Signal>
        <Size>Size : AWG 10</Size>
      </myXMLFile>
      <myXMLFile>
        <Signal>Signal : 1071</Signal>
        <Size>Size : AWG 10</Size>
      </myXMLFile>
      <myXMLFile>
        <Signal>Signal : 1071</Signal>
        <Size>Size : AWG 10</Size>
      </myXMLFile>
      <myXMLFile>
        <Signal>Signal : 1072</Signal>
        <Size>Size : AWG 16</Size>
      </myXMLFile>
      <myXMLFile>
        <Signal>Signal : 1073</Signal>
        <Size>Size : AWG 14</Size>
      </myXMLFile>
      <myXMLFile>
        <Signal>Signal : 1073</Signal>
        <Size>Size : AWG 14</Size>
      </myXMLFile>
    </DocumentElement>
    Using this structure you could then say:-

    Code:
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
      Dim myXMLDoc As XDocument = XDocument.Load("d:\temp2\convertedToXML.xml")
      Dim wiredatas = (From n In myXMLDoc.<DocumentElement>.<myXMLFile> Select strSignal = n.<Signal>.Value.ToString, strSize = n.<Size>.Value.ToString Order By strSignal, strSize)
     
      ListBox1.Items.AddRange(wiredatas.Select(Function(x) x.strsignal & " " & x.strSize).ToArray)
    End Sub
    Which will sort correctly (as per the rules of sorting strings) based on the first and second columns.

    I am sure you should be able to modify this to accommodate your own XML file structure.

    Hope that helps.

    Cheers,

    Ian
    Last edited by IanRyder; May 24th, 2013 at 09:26 AM.

  5. #5
    eXtreme Programmer .paul.'s Avatar
    Join Date
    May 2007
    Location
    Chelmsford UK
    Posts
    26,415

    Re: Linq to Xml sorting

    Quote Originally Posted by Crzyrio View Post
    EDIT: Really Close!

    vb.net Code:
    1. Dim wiredatas = From n In doc.<Data>.<WireData>.<Signal_Name> Order By CStr([email protected]()), CStr(GetNumber(n.<Size>.Value.Substring(3)))

    For some reason, they are still apart. It does not make sense why the bolded ones are seperated
    numeric sorting is completely different to string sorting. that's why I suggested integers

  6. #6

    Thread Starter
    Addicted Member
    Join Date
    Jan 2013
    Posts
    177

    Re: Linq to Xml sorting

    Quote Originally Posted by .paul. View Post
    numeric sorting is completely different to string sorting. that's why I suggested integers
    Sorry about that , forgot to change it.

    But with the Signal, I have times have signals that are GND and not numeric values, how would this work then?

    vb.net Code:
    1. Dim wiredatas = From n In doc.<Data>.<WireData>.<Signal_Name> Order By CStr([email protected]()), CInt(GetNumber(n.<Size>.Value.Substring(3)))


    Quote Originally Posted by IanRyder View Post
    Hi,

    Since you did not provide an example of the structure of your XML file I have created an assumed XML file in the form of:-

    HTML Code:
    <?xml version="1.0" standalone="true"?>
    <DocumentElement>
      <myXMLFile>
        <Signal>Signal : 1051</Signal>
        <Size>Size : AWG 10</Size>
      </myXMLFile>
      <myXMLFile>
        <Signal>Signal : 1052</Signal>
        <Size>Size : AWG 10</Size>
      </myXMLFile>
      <myXMLFile>
        <Signal>Signal : 1053</Signal>
        <Size>Size : AWG 10</Size>
      </myXMLFile>
      <myXMLFile>
        <Signal>Signal : 1071</Signal>
        <Size>Size : AWG 10</Size>
      </myXMLFile>
      <myXMLFile>
        <Signal>Signal : 1071</Signal>
        <Size>Size : AWG 10</Size>
      </myXMLFile>
      <myXMLFile>
        <Signal>Signal : 1072</Signal>
        <Size>Size : AWG 16</Size>
      </myXMLFile>
      <myXMLFile>
        <Signal>Signal : 1073</Signal>
        <Size>Size : AWG 14</Size>
      </myXMLFile>
      <myXMLFile>
        <Signal>Signal : 1073</Signal>
        <Size>Size : AWG 14</Size>
      </myXMLFile>
    </DocumentElement>
    Using this structure you could then say:-

    Code:
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
      Dim myXMLDoc As XDocument = XDocument.Load("d:\temp2\convertedToXML.xml")
      Dim wiredatas = (From n In myXMLDoc.<DocumentElement>.<myXMLFile> Select strSignal = n.<Signal>.Value.ToString, strSize = n.<Size>.Value.ToString Order By strSignal, strSize)
     
      ListBox1.Items.AddRange(wiredatas.Select(Function(x) x.strsignal & " " & x.strSize).ToArray)
    End Sub
    Which will sort correctly (as per the rules of sorting strings) based on the first and second columns.

    I am sure you should be able to modify this to accommodate your own XML file structure.

    Hope that helps.

    Cheers,

    Ian
    Ill be sure to include the xml file next time :P

    Thanks, I will just have to play around with it a little more.

    I am actually using the query like this



    vb.net Code:
    1. Dim wiredatas = From n In doc.<Data>.<WireData>.<Signal_Name> Order By CInt(n.@Signal), CInt(GetNumber(n.<Size>.Value.Substring(3)))
    2.               Select New WireData With {
    3.                   .Signal = n.@Signal,
    4.                   .FromDevice = n.<From_Device>.Value,
    5.                   .ToDevice = n.<To_Device>.Value, .CoreName = (n.<Core_Name>.Value),
    6.                   .WireColor = n.<Colour>.Value,
    7.                   .WireSize = n.<Size>.Value,
    8.                   .WireType = n.<Type>.Value}
    Last edited by Crzyrio; May 24th, 2013 at 09:44 AM.

  7. #7
    Frenzied Member IanRyder's Avatar
    Join Date
    Jan 2013
    Location
    Healing, UK
    Posts
    1,232

    Re: Linq to Xml sorting

    Hi,

    Rather than doing what you are showing, you can just set your Source Object to another variable in the Select Clause of the LINQ query. i.e:-

    Code:
    Dim wiredatas = (From n In myXMLDoc.<DocumentElement>.<myXMLFile> Select mySourceObject = n, strSignal = n.<Signal>.Value.ToString, strSize = n.<Size>.Value.ToString Order By strSignal, strSize)
    Doing that, you get the sorting you need and then the information you want is accessed via the wiredatas array (to be specific a collection of IOrderedEnumerable(Of Anonymous Type)) through the original object of the LINQ query. i.e:-

    Code:
    MsgBox(wiredatas(0).mySourceObject.<Signal>.Value.ToString)
    Hope that helps.

    Cheers,

    Ian
    Last edited by IanRyder; May 24th, 2013 at 10:15 AM.

  8. #8
    Frenzied Member MattP's Avatar
    Join Date
    Dec 2008
    Location
    WY
    Posts
    1,227

    Re: Linq to Xml sorting

    Here's a quick example sorting using a natural sort algorithm. Orig here: http://www.davekoelle.com/files/AlphanumComparator.cs

    vb.net Code:
    1. Imports System.Collections
    2. Imports System.Text
    3.  
    4. Public Class NaturalComparator
    5.     Implements IComparer(Of String)
    6.  
    7.     Private Enum ChunkType
    8.         Alphanumeric
    9.         Numeric
    10.     End Enum
    11.  
    12.     Private Function InChunk(ch As Char, otherCh As Char) As Boolean
    13.         Dim [type] As ChunkType = ChunkType.Alphanumeric
    14.  
    15.         If Char.IsDigit(otherCh) Then
    16.             [type] = ChunkType.Numeric
    17.         End If
    18.  
    19.         If ([type] = ChunkType.Alphanumeric AndAlso Char.IsDigit(ch)) OrElse ([type] = ChunkType.Numeric AndAlso Not Char.IsDigit(ch)) Then
    20.             Return False
    21.         End If
    22.  
    23.         Return True
    24.     End Function
    25.  
    26.     Public Function Compare(x As String, y As String) As Integer Implements IComparer(Of String).Compare
    27.         Dim s1 As String = TryCast(x, String)
    28.         Dim s2 As String = TryCast(y, String)
    29.  
    30.         If s1 Is Nothing OrElse s1 Is Nothing Then
    31.             Return 0
    32.         End If
    33.  
    34.         Dim thisMarker As Integer = 0
    35.         Dim thisNumericChunk As Integer = 0
    36.         Dim thatMarker As Integer = 0
    37.         Dim thatNumericChunk As Integer = 0
    38.  
    39.         While thisMarker < s1.Length OrElse thatMarker < s2.Length
    40.             If thisMarker >= s1.Length Then
    41.                 Return -1
    42.             ElseIf thatMarker >= s2.Length Then
    43.                 Return 1
    44.             End If
    45.  
    46.             Dim thisCh = s1(thisMarker)
    47.             Dim thatCh = s2(thatMarker)
    48.  
    49.             Dim thisChunk As New StringBuilder()
    50.             Dim thatChunk As New StringBuilder()
    51.  
    52.             While (thisMarker < s1.Length) AndAlso (thisChunk.Length = 0 OrElse InChunk(thisCh, thisChunk(0)))
    53.                 thisChunk.Append(thisCh)
    54.                 thisMarker += 1
    55.  
    56.                 If thisMarker < s1.Length Then
    57.                     thisCh = s1(thisMarker)
    58.                 End If
    59.             End While
    60.  
    61.             While (thatMarker < s2.Length) AndAlso (thatChunk.Length = 0 OrElse InChunk(thatCh, thatChunk(0)))
    62.                 thatChunk.Append(thatCh)
    63.                 thatMarker += 1
    64.  
    65.                 If thatMarker < s2.Length Then
    66.                     thatCh = s2(thatMarker)
    67.                 End If
    68.             End While
    69.  
    70.             Dim result As Integer = 0
    71.  
    72.             If Char.IsDigit(thisChunk(0)) AndAlso Char.IsDigit(thatChunk(0)) Then
    73.                 thisNumericChunk = Convert.ToInt32(thisChunk.ToString())
    74.                 thatNumericChunk = Convert.ToInt32(thatChunk.ToString())
    75.  
    76.                 If thisNumericChunk < thatNumericChunk Then
    77.                     result = -1
    78.                 End If
    79.  
    80.                 If thisNumericChunk > thatNumericChunk Then
    81.                     result = 1
    82.                 End If
    83.             Else
    84.                 result = thisChunk.ToString().CompareTo(thatChunk.ToString())
    85.             End If
    86.  
    87.             If result <> 0 Then
    88.                 Return result
    89.             End If
    90.         End While
    91.  
    92.         Return 0
    93.     End Function
    94.  
    95. End Class

    Usage:

    vb.net Code:
    1. Public Class Form1
    2.  
    3.     Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4.         Dim xdoc = <?xml version="1.0" standalone="yes"?>
    5.                    <Data>
    6.                        <WireData>
    7.                            <Signal_Name Name="1000">
    8.                                <Wire_Size>AWG 20</Wire_Size>
    9.                            </Signal_Name>
    10.                            <Signal_Name Name="1001">
    11.                                <Wire_Size>AWG 20</Wire_Size>
    12.                            </Signal_Name>
    13.                            <Signal_Name Name="1000">
    14.                                <Wire_Size>AWG 10</Wire_Size>
    15.                            </Signal_Name>
    16.                        </WireData>
    17.                    </Data>
    18.  
    19.         Dim wiredatas = xdoc.<Data>.<WireData>.<Signal_Name> _
    20.                         .OrderBy(Function(n) CInt(n.@Name)) _
    21.                         .ThenBy(Function(n) n.<Wire_Size>.Value, New NaturalComparator()).ToList()
    22.  
    23.     End Sub
    24.  
    25. End Class
    This pattern in common to all great programmers I know: they're not experts in something as much as experts in becoming experts in something.

    The best programming advice I ever got was to spend my entire career becoming educable. And I suggest you do the same.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  



Click Here to Expand Forum to Full Width