How to end a for loop without a comma? VB.NET - vb.net

i was about to save each number from one cell using for loop here is my code:
For Each node As XmlNode In xmlnode
Dim X As String
Dim Y As String
Dim Z As String
X = node.SelectSingleNode("X").InnerText
Y = node.SelectSingleNode("Y").InnerText
Z = node.SelectSingleNode("Z").InnerText
Dim noOfPts As Integer = 0 'number of data points in data
For i As Double = 0 To noOfPts
result = X + ","
result2 = Y + ","
Next
Next
the thing is i'm going to end the loop without saving the comma. Instead of this "1,2,3,4,5," it should be like this "1,2,3,4,5" remove the comma from the end of the loop.

With StringBuilder you can simplify the loop by removing if statements and make more efficient in most of the cases (especially when you building a string in the loop).
Dim xBuilder AS New StringBuilder()
Dim yBuilder As New StringBuilder()
Dim delimiter As String = ", "
For Each node As XmlNode In xmlnode
Dim X As String = node.SelectSingleNode("X").InnerText
Dim Y As String = node.SelectSingleNode("Y").InnerText
Dim Z As String = node.SelectSingleNode("Z").InnerText
For i As Integer = 0 To noOfPts
xBuilder.Append(X).Append(delimiter)
yBuilder.Append(Y).Append(delimiter)
Next
Next
' use Math.Max to prevent exception if builder is empty
xBuilder.Length = Math.Max(xBuilder.Length - delimiter.Length, 0)
yBuilder.Length = Math.Max(yBuilder.Length - delimiter.Length, 0)
Dim resultX As String = xBuilder.ToString() ' 1, 2, 3, 4, 5
Dim resultY As String = yBuilder.ToString()
We are removing last "redundant" delimiter by "cutting" stringbuilder's length by length of delimiter.
For using String.Join you need to create a collection of values first
Dim xValues AS New List<string>()
Dim yValues As New List<string>()
For Each node As XmlNode In xmlnode
Dim X As String = node.SelectSingleNode("X").InnerText
Dim Y As String = node.SelectSingleNode("Y").InnerText
Dim Z As String = node.SelectSingleNode("Z").InnerText
For i As Integer = 0 To noOfPts
xValues.Add(X)
xValues.Add(Y)
Next
Next
Dim resultX As String = String.Join(", ", xValues) ' 1, 2, 3, 4, 5
Dim resultY As String = String.Join(", ", yValues)

I like to do it this way:
For i As Double = 0 To noOfPts
If result <> "" Then result &= ", "
result &= X
If result2 <> "" Then result2 &= ", "
result2 &= Y
Next
Have fun!

Related

Combining two string and insert element VB.Net

I tried to build a combination algorithm between 2 strings, unfortunately it has some errors.
Dim strWordsA() As String = TextBox1.Text.Split(",")
Dim strWordsB() As String = TextBox2.Text.Split(",")
Dim str As String = TextBox1.Text
Dim arr As String() = TextBox1.Text.Split(","c)
For i As Integer = 0 To TextBox1.Text.Split(",").Length - 1
Dim index As Integer = str.IndexOf(strWordsA(i))
TextBox1.Text = str.Insert(index + 2, "," & strWordsB(i))
str = TextBox1.Text
Next
so if we have Textbox1.Text = 1,2,3,4,5,6,7,8,9 and Textbox2.Text = a,b,c,f,d,b,i,h, and so on... I need to display this in a 3rd textbox
Textbox3.Text = 1,a,2,b,3,c,4,f and so on
so do I combine these 2 strings?
the first element in the index displays it incorrectly, otherwise it seems to work ok.
Try this:
Private Function MergeStrings(s1 As String, s2 As String) As String
Dim strWordsA() As String = s1.Split(","c)
Dim strWordsB() As String = s2.Split(","c)
Dim i As Integer = 0
Dim OutputString As String = String.Empty
While i < strWordsA.Length OrElse i < strWordsB.Length
If i < strWordsA.Length Then OutputString &= "," & strWordsA(i)
If i < strWordsB.Length Then OutputString &= "," & strWordsB(i)
i += 1
End While
If Not OutputString = String.Empty Then Return OutputString.Substring(1)
Return OutputString
End Function
Usage:
Dim s As String = MergeStrings("1,2,3,4,5,6,7,8,9", "a,b,c,f,d,b,i,h")
You will need to add your own validation to allow for trailing commas or no commas etc but it should work with different length input strings
EDIT: amended as per Mary's comment

Check if an item is available in a JSON.NET Newtonsoft object

I have the line of code that I want which is:
mid= jToken.Value<double?>("mid") ?? 100;
in C# but I need it in VB.NET I got it from Get value from JToken that may not exist (best practices)
But I'm have a bit of trouble in converting that to the proper syntax in VB. I've tried
Dim mid As String = item.Value(Of String)("mid") ?? ""
But it does not like the?
What I would like is to end with an empty string or blank if the value is not in the object. This is my full code
Dim obj As JObject = JObject.Parse(respHTML)
Dim records As JArray = DirectCast(obj("records"), JArray)
For i As Integer = 0 To records.Count - 1
Dim item As JObject = DirectCast(records(i), JObject)
Dim pmid As Integer = item("pmid").Value(Of Integer)
Dim pmcid As String = item("pmcid").Value(Of String)
Dim doi As String = item("doi").Value(Of String)
' Dim mid As String = item("mid").Value(Of String)
Dim mid As String = item.Value(Of String)("mid") ?? ""
MessageBox.Show(pmid.ToString + " " + pmcid + " " + doi + " " + mid)
Next
I ended up with:
Dim obj As JObject = JObject.Parse(respHTML)
Dim records As JArray = DirectCast(obj("records"), JArray)
For i As Integer = 0 To records.Count - 1
Dim item As JObject = DirectCast(records(i), JObject)
Dim pmid As String = If(item.Value(Of String)("pmid"), "")
Dim pmcid As String = If(item.Value(Of String)("pmcid"), "")
Dim doi As String = If(item.Value(Of String)("doi"), "")
Dim mid As String = If(item.Value(Of String)("mid"), "")
MessageBox.Show(pmid.ToString + " " + pmcid + " " + doi + " " + mid)
Next
The message box line will be replaced with a database call

How can I get String values rather than integer

How To get StartString And EndString
Dim startNumber As Integer
Dim endNumber As Integer
Dim i As Integer
startNumber = 1
endNumber = 4
For i = startNumber To endNumber
MsgBox(i)
Next i
Output: 1,2,3,4
I want mo make this like sample: startString AAA endString AAD
and the output is AAA, AAB, AAC, AAD
This is a simple function that should be easy to understand and use. Every time you call it, it just increments the string by one value. Just be careful to check the values in the text boxes or you can have an endless loop on your hands.
Function AddOneChar(Str As String) As String
AddOneChar = ""
Str = StrReverse(Str)
Dim CharSet As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
Dim Done As Boolean = False
For Each Ltr In Str
If Not Done Then
If InStr(CharSet, Ltr) = CharSet.Length Then
Ltr = CharSet(0)
Else
Ltr = CharSet(InStr(CharSet, Ltr))
Done = True
End If
End If
AddOneChar = Ltr & AddOneChar
Next
If Not Done Then
AddOneChar = CharSet(0) & AddOneChar
End If
End Function
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim S = TextBox1.Text
Do Until S = TextBox2.Text
S = AddOneChar(S)
MsgBox(S)
Loop
End Sub
This works as a way to all the codes given an arbitrary alphabet:
Public Function Generate(starting As String, ending As String, alphabet As String) As IEnumerable(Of String)
Dim increment As Func(Of String, String) = _
Function(x)
Dim f As Func(Of IEnumerable(Of Char), IEnumerable(Of Char)) = Nothing
f = _
Function(cs)
If cs.Any() Then
Dim first = cs.First()
Dim rest = cs.Skip(1)
If first = alphabet.Last() Then
rest = f(rest)
first = alphabet(0)
Else
first = alphabet(alphabet.IndexOf(first) + 1)
End If
Return Enumerable.Repeat(first, 1).Concat(rest)
Else
Return Enumerable.Empty(Of Char)()
End If
End Function
Return New String(f(x.ToCharArray().Reverse()).Reverse().ToArray())
End Function
Dim results = New List(Of String)
Dim text = starting
While True
results.Add(text)
If text = ending Then
Exit While
End If
text = increment(text)
End While
Return results
End Function
I used it like this to produce the required result:
Dim alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
Dim results = Generate("S30AB", "S30B1", alphabet)
This gave me 63 values:
S30AB
S30AC
...
S30BY
S30BZ
S30B0
S30B1
It should now be very easy to modify the alphabet as needed and to use the results.
One option would be to put those String values into an array and then use i as an index into that array to get one element each iteration. If you do that though, keep in mind that array indexes start at 0.
You can also use a For Each loop to access each element of the array without the need for an index.
if the default first two string value of your output is AA.
You can have a case or if-else conditioning statement :
and then set 1 == A 2 == B...
the just add or concatenate your default two string and result string of your case.
I have tried to understand that you are looking for a series using range between 2 textboxes. Here is the code which will take the series and will give the output as required.
Dim startingStr As String = Mid(TextBox1.Text, TextBox1.Text.Length, 1)
Dim endStr As String = Mid(TextBox2.Text, TextBox2.Text.Length, 1)
Dim outputstr As String = String.Empty
Dim startNumber As Integer
Dim endNumber As Integer
startNumber = Asc(startingStr)
endNumber = Asc(endStr)
Dim TempStr As String = Mid(TextBox1.Text, 1, TextBox1.Text.Length - 1)
Dim i As Integer
For i = startNumber To endNumber
outputstr = outputstr + ", " + TempStr + Chr(i)
Next i
MsgBox(outputstr)
The First two lines will take out the Last Character of the String in the text box.
So in your case it will get A and D respectively
Then outputstr to create the series which we will use in the loop
StartNumber and EndNumber will be give the Ascii values for the character we fetched.
TempStr to Store the string which is left off of the series string like in our case AAA - AAD Tempstr will have AA
then the simple loop to get all the items fixed and show
in your case to achive goal you may do something like this
Dim S() As String = {"AAA", "AAB", "AAC", "AAD"}
For Each el In S
MsgBox(el.ToString)
Next
FIX FOR PREVIOUS ISSUE
Dim s1 As String = "AAA"
Dim s2 As String = "AAZ"
Dim Last As String = s1.Last
Dim LastS2 As String = s2.Last
Dim StartBase As String = s1.Substring(0, 2)
Dim result As String = String.Empty
For I As Integer = Asc(s1.Last) To Asc(s2.Last)
Dim zz As String = StartBase & Chr(I)
result += zz & vbCrLf
zz = Nothing
MsgBox(result)
Next
**UPDATE CODE VERSION**
Dim BARCODEBASE As String = "SBA0021"
Dim BarCode1 As String = "SBA0021AA1"
Dim BarCode2 As String = "SBA0021CD9"
'return AA1
Dim FirstBarCodeSuffix As String = Replace(BarCode1, BARCODEBASE, "")
'return CD9
Dim SecondBarCodeSuffix As String = Replace(BarCode2, BARCODEBASE, "")
Dim InternalSecondBarCodeSuffix = SecondBarCodeSuffix.Substring(1, 1)
Dim IsTaskCompleted As Boolean = False
For First As Integer = Asc(FirstBarCodeSuffix.First) To Asc(SecondBarCodeSuffix)
If IsTaskCompleted = True Then Exit For
For Second As Integer = Asc(FirstBarCodeSuffix.First) To Asc(InternalSecondBarCodeSuffix)
For Third As Integer = 1 To 9
Dim tmp = Chr(First) & Chr(Second) & Third
Console.WriteLine(BARCODEBASE & tmp)
If tmp = SecondBarCodeSuffix Then
IsTaskCompleted = True
End If
Next
Next
Next
Console.WriteLine("Completed")
Console.Read()
Take a look into this check it and let me know if it can help

Getting substrings between commas. Why Mid(string,integer,integer) is failing?

I have a textbox (DropDownList1) that contains a string of 46 characters following this format:
(string1,string2,string3)
I want to get string values without the commas, this way:
a=string1
b=string2
c=string3
So I used the below code:
Dim a As String
Dim b As String
Dim c As String
Dim x As Integer = InStr(1, DropDownList1.Text, ",", CompareMethod.Text) + 1
Dim y As Integer = InStr(InStr(1, DropDownList1.Text, ",", CompareMethod.Text) + 1, DropDownList1.Text, ",") - 1
Dim z As Integer = Len(DropDownList1.Text)
a = Mid(DropDownList1.Text, 1, InStr(1, DropDownList1.Text, ",", CompareMethod.Text) - 1)
b = Mid(DropDownList1.Text, x, y) _
'InStr(1, DropDownList1.Text, ",", CompareMethod.Text) + 1, _
'InStr(InStr(1, DropDownList1.Text, ",", CompareMethod.Text) + 1, DropDownList1.Text, ",") - 1)
c = Mid(DropDownList1.Text, _
InStr(InStr(1, DropDownList1.Text, ",", CompareMethod.Text) + 1, DropDownList1.Text, ",") + 1, _
Len(DropDownList1.Text))
However, when I debug it happens:
x=18 (which is correct with the string I was using)
y=42 (correct too)
z=46 (correct)
a=string1 (yes!)
c=string3 (yes again!)
and b=string2,string3 ----->what happened here?
Can you please tell what is wrong with my code? I simply don't get it
Assuming x,y, and z are just for debugging, and it's really a,b, and c that you care about, and that there are no commas or parenthese in the important parts of your string:
Dim values = DropDownList1.Text.Replace("(","").Replace(")","").Split(","c)
Dim a as String = values(0)
Dim b As String = values(1)
Dim c As String = values(2)
Use the Split() function on the string, applying it to some string array variable, and then assigning the values to your variables as needed if you still want to.
If in fact you're using VB.NET you can use the Split function.
Dim text As String = "a,b,c"
Dim parts As String() = text.Split(CChar(","))
Dim a As String = parts(0)
Dim b As String = parts(1)
Dim c As String = parts(2)
Give this a try...
Private Sub ParseMyString()
Dim TargetString() As String = Split("string1,string2,string3", ",")
Dim Count As Integer = 0
Dim Result As String
Const ASC_OFFSET As Integer = 97
Result = ""
Do Until Count > UBound(TargetString)
Result = Result & Chr(ASC_OFFSET + Count) & "=" & TargetString(Count) & vbCrLf
Count = Count + 1
Loop
MsgBox(Result)
End Sub

Help with using an array to insert items into a textbox vb.net

I'm still a student without much experience using vb.net and I am having some trouble splitting a string within an array into 2 values. For example in my textbox I have several lines of measurements that are Length x Width: 20x14, 10x8, 16x13. Each measurement is on its own line. I'm trying to split all Width values that are greater than 12 into 2 separate measurements, so with that last example, I would have 5 measurements (LxW): 20x12, 20x2, 10x8, 16x12, 16x1, then I would like to add these measurements to a new textbox with each measurement on its own line.
Here is the code I have so far. Again, I am very new to programming and this is the first serious project for me since "Hello World", so what I have might be way off. Thanks in advance.
Dim room As String = RoomsTextBox.Text
If room.EndsWith(vbCrLf) Then room = room.Substring(0, room.Length - vbCrLf.Length)
Dim roomarray() As String = room.Split(vbCrLf)
Dim Cuts(roomarray.Length - 1, 0) As String
RoomsTextBox.Select(0, 0)
Dim CutLength As Integer
Dim CutWidth As Integer
Dim i As Integer
Dim j As Integer
CutsTextBox.Select()
Cuts(i, j) = (Val(roomarray(i).Split("x")(0))) & Val(roomarray(j).Split("x")(1))
For i = 0 To Cuts.GetUpperBound(0)
For j = 0 To Cuts.GetUpperBound(1)
Cuts(i, j) = 0
Next
If Val(roomarray(i)) > 12 Then
CutWidth = Val(roomarray(i)) - 12
CutLength = Val(roomarray(j))
Else
CutWidth = Val(roomarray(i))
CutLength = Val(roomarray(j))
End If
Dim inserttext = CutsTextBox.Text
Dim insertposition As Integer = CutsTextBox.SelectionStart
CutsTextBox.Text = CutsTextBox.Text.Insert(0, CutLength.ToString & "x" & _
CutWidth.ToString)
CutsTextBox.SelectionStart = insertposition + inserttext.Length
Next i
I even tried it with inserting the measurements into a ListBox. Here is the code for that:
Dim room As String = RoomsTextBox.Text
Dim roomarray() As String = room.Split(vbCrLf)
Dim Cuts(roomarray.Length - 1, 0) As String
Dim CutLength As Integer
Dim CutWidth As Integer
Dim i As Integer
Dim j As Integer
CutsTextBox.Select()
Cuts(i, j) = (Val(roomarray(i).Split("x")(0))) & Val(roomarray(j).Split("x")(1))
For i = 0 To Cuts.GetUpperBound(0)
For j = 0 To Cuts.GetUpperBound(1)
Cuts(i, j) = 0
Next
If Val(roomarray(i)) > 12 Then
CutWidth = Val(roomarray(i)) - 12
CutLength = Val(roomarray(j))
Else
CutWidth = Val(roomarray(i))
CutLength = Val(roomarray(j))
End If
ListBox1.Items.Add(CutLength.ToString & "x" & CutWidth.ToString)
Next i
Try this out.
Dim dimensions As String() = txtInput.Text.Split(vbCrLf)
Dim final As New List(Of String)
For Each item In dimensions
Dim lw As String() = item.Split("x")
Dim length As String = lw(0)
Dim width As Integer = CInt(lw(1))
If width > 12 Then
Dim new1 As String
Dim new2 As String
new1 = length & "x" & (width - 12).ToString
new2 = length & "x12"
final.Add(new1)
final.Add(new2)
Else
final.Add(item)
End If
Next
For Each item In final
txtOutPut.Text += item & vbCrLf
Next