|
-
May 24th, 2013, 07:59 AM
#1
Thread Starter
Addicted Member
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:
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:
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
-
May 24th, 2013, 08:07 AM
#2
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 ", ""))
- Coding Examples:
- Features:
- Online Games:
- Compiled Games:
-
May 24th, 2013, 08:15 AM
#3
Thread Starter
Addicted Member
Re: Linq to Xml sorting
 Originally Posted by .paul.
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:
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.
-
May 24th, 2013, 09:22 AM
#4
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.
-
May 24th, 2013, 09:25 AM
#5
Re: Linq to Xml sorting
 Originally Posted by Crzyrio
EDIT: Really Close!
vb.net Code:
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
- Coding Examples:
- Features:
- Online Games:
- Compiled Games:
-
May 24th, 2013, 09:35 AM
#6
Thread Starter
Addicted Member
Re: Linq to Xml sorting
 Originally Posted by .paul.
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:
Dim wiredatas = From n In doc.<Data>.<WireData>.<Signal_Name> Order By CStr( [email protected]()), CInt(GetNumber(n.<Size>.Value.Substring(3)))
 Originally Posted by IanRyder
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:
Dim wiredatas = From n In doc.<Data>.<WireData>.<Signal_Name> Order By CInt(n.@Signal), CInt(GetNumber(n.<Size>.Value.Substring(3))) Select New WireData With { .Signal = n.@Signal, .FromDevice = n.<From_Device>.Value, .ToDevice = n.<To_Device>.Value, .CoreName = (n.<Core_Name>.Value), .WireColor = n.<Colour>.Value, .WireSize = n.<Size>.Value, .WireType = n.<Type>.Value}
Last edited by Crzyrio; May 24th, 2013 at 09:44 AM.
-
May 24th, 2013, 10:04 AM
#7
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.
-
May 24th, 2013, 10:17 AM
#8
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:
Imports System.Collections
Imports System.Text
Public Class NaturalComparator
Implements IComparer(Of String)
Private Enum ChunkType
Alphanumeric
Numeric
End Enum
Private Function InChunk(ch As Char, otherCh As Char) As Boolean
Dim [type] As ChunkType = ChunkType.Alphanumeric
If Char.IsDigit(otherCh) Then
[type] = ChunkType.Numeric
End If
If ([type] = ChunkType.Alphanumeric AndAlso Char.IsDigit(ch)) OrElse ([type] = ChunkType.Numeric AndAlso Not Char.IsDigit(ch)) Then
Return False
End If
Return True
End Function
Public Function Compare(x As String, y As String) As Integer Implements IComparer(Of String).Compare
Dim s1 As String = TryCast(x, String)
Dim s2 As String = TryCast(y, String)
If s1 Is Nothing OrElse s1 Is Nothing Then
Return 0
End If
Dim thisMarker As Integer = 0
Dim thisNumericChunk As Integer = 0
Dim thatMarker As Integer = 0
Dim thatNumericChunk As Integer = 0
While thisMarker < s1.Length OrElse thatMarker < s2.Length
If thisMarker >= s1.Length Then
Return -1
ElseIf thatMarker >= s2.Length Then
Return 1
End If
Dim thisCh = s1(thisMarker)
Dim thatCh = s2(thatMarker)
Dim thisChunk As New StringBuilder()
Dim thatChunk As New StringBuilder()
While (thisMarker < s1.Length) AndAlso (thisChunk.Length = 0 OrElse InChunk(thisCh, thisChunk(0)))
thisChunk.Append(thisCh)
thisMarker += 1
If thisMarker < s1.Length Then
thisCh = s1(thisMarker)
End If
End While
While (thatMarker < s2.Length) AndAlso (thatChunk.Length = 0 OrElse InChunk(thatCh, thatChunk(0)))
thatChunk.Append(thatCh)
thatMarker += 1
If thatMarker < s2.Length Then
thatCh = s2(thatMarker)
End If
End While
Dim result As Integer = 0
If Char.IsDigit(thisChunk(0)) AndAlso Char.IsDigit(thatChunk(0)) Then
thisNumericChunk = Convert.ToInt32(thisChunk.ToString())
thatNumericChunk = Convert.ToInt32(thatChunk.ToString())
If thisNumericChunk < thatNumericChunk Then
result = -1
End If
If thisNumericChunk > thatNumericChunk Then
result = 1
End If
Else
result = thisChunk.ToString().CompareTo(thatChunk.ToString())
End If
If result <> 0 Then
Return result
End If
End While
Return 0
End Function
End Class
Usage:
vb.net Code:
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim xdoc = <?xml version="1.0" standalone="yes"?>
<Data>
<WireData>
<Signal_Name Name="1000">
<Wire_Size>AWG 20</Wire_Size>
</Signal_Name>
<Signal_Name Name="1001">
<Wire_Size>AWG 20</Wire_Size>
</Signal_Name>
<Signal_Name Name="1000">
<Wire_Size>AWG 10</Wire_Size>
</Signal_Name>
</WireData>
</Data>
Dim wiredatas = xdoc.<Data>.<WireData>.<Signal_Name> _
.OrderBy(Function(n) CInt(n.@Name)) _
.ThenBy(Function(n) n.<Wire_Size>.Value, New NaturalComparator()).ToList()
End Sub
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
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|