Convert integer array to string array - vb.net

whats the easiest way to convert an array of integers into string form? I'm trying to copy the whole array of integers into strings.
{1, 2, 3}
to
{"1", "2", "3"}

The easiest method would be to use the Select extension method which is provided by LINQ:
Dim intArray() As Integer = {1, 2, 3}
Dim strArray() As String = intArray.Select(Function(x) x.ToString()).ToArray()
If you don't want to, or cannot use LINQ, you can use the Array.ConvertAll method, which is almost as easy:
Dim strArray() As String = Array.ConvertAll(Of Integer, String)(intArray, Function(x) x.ToString())
EDIT
Based on your comments, below, it looks like you need to convert from an ArrayList of integers to an ArrayList of strings. In that case, you could do it like this:
Dim intArray As New ArrayList({1, 2, 3})
Dim strArray As New ArrayList(intArray.ToArray().Select(Function(x) x.ToString()).ToArray())
Although, at that point, it's starting to get a bit messier. It's probably easier to just do a standard loop, like this:
Dim myArray As New ArrayList({1, 2, 3})
For i As Integer = myArray.Count - 1 To 0 Step -1
myArray(i) = myArray(i).ToString()
Next
For what it's worth, though, unless you are still on a really old version of the .NET Framework, you really ought to be using the List(Of T) class rather than the ArrayList class, in most cases.

Related

Detect changes in array

Let's assume we have an array defined like the following:
Dim Data1 As Object()
Dim Data2 As Double()
I would like to find a way to manage changes in an Array, such as:
//Example #1
Redim Data2(5)
//Example #2
Data2(0) = 3.14
My idea was to create a CustomArray(of T), which inherits from System.Array, and raise an event at the right time. Unfortunately, however, the System.Array class cannot be inherited...
I know that for this kind of operations it would be better to use other data structures (ObservableCollection), but I need to keep the arrays functions (for example Redim and Ubound): by creating a new class (with all array functions), I would still not be able to use Ubound, which requires a System.Array.
Is there a solution?
Ubound and Redim can be simulated. A short example,
Dim foo As New List(Of String) From {"A", "B", "C", "Z"}
Dim uBnd As Integer = foo.Count - 1 ' UBound
' redim - grow
foo.AddRange({"d", "e", "f", "x"})
' redim - decrease
foo.RemoveRange(1, 3)

VB.Net equivalent of Javascript's .Map function

Given an array of strings, say: Dim array1 As String() = {"1", "2", "3"} what is the best way to copy that array and perform an action on each element?
In other words, what is the best way to copy that array to come up with: array2 as integer() = {1, 2, 3}
For example, something similar to JavaScript's .Map function:
var numbers = [4, 9, 16, 25];
function myFunction() {
x = document.getElementById("demo")
x.innerHTML = numbers.map(Math.sqrt);
}
// Result: 2, 3, 4, 5
If it isn't possible in one line - as I suspect it isn't - what is your quickest alternative? Thanks!
If you don't want to use any LINQ extension methods, but you are okay with using lambda expressions, you can still do it in one line using Array.ConvertAll:
Dim input() As String = {"1", "2", "3"}
Dim output() As Integer = Array.ConvertAll(input, Function(x) Integer.Parse(x))
However, it does beg the question: why not just use LINQ, at that point, since it's effectively the same thing:
Dim input() As String = {"1", "2", "3"}
Dim output() As Integer = input.Select(Function(x) Integer.Parse(x)).ToArray()
The classic imperative way to do this in VB, without using LINQ or lambdas, would be a for-loop:
Dim input() As String = {"1", "2", "3"}
Dim output(LBound(input) To UBound(input)) As Integer
For i As Integer = LBound(input) To UBound(input)
output(i) = Integer.Parse(input(i))
Next
I would like to add that, similar to JavaScript, .NET's map equivalent Select also supports method groups as well as lambdas.
Here's an example using a lambda:
Dim output = input.Select(Function(x) SomeMethod(x)).ToArray()
Here's an example using a method group. Since parenthesis on method invocations are optional in VB.NET, the additional AddressOf keyword is required:
Dim output = input.Select(AddressOf SomeMethod).ToArray()
For completeness, here's an example using the LINQ query syntax, which is just syntactic sugar for the first example:
Dim output = (From x In input Select SomeMethod(x)).ToArray()
If you don't want to use LINQ here is the classic way, a loop:
Dim numbers = {4, 9, 16, 25}
For i As Int32 = 0 To numbers.Length - 1
numbers(i) = CInt(Math.Sqrt(numbers(i)))
Next

Compare 2 ArrayLists and remove duplicates

I am looking to compare values of 2 different ArrayLists, and remove any duplicates from 1 ArrayList.
Example:
Arr1 = {HF,HA,GM,RV}
Arr2 = {FB,HA}
Since they have 'HA' in common, I would like to remove 'HA' from Arr1. Any help or point in the right direction would be appreciated.
You can use LINQ's Except but you will have to convert array lists to regular arrays first:
https://msdn.microsoft.com/en-us/library/bb300779(v=vs.110).aspx
Dim list1 As New ArrayList()
list1.Add("A")
list1.Add("B")
list1.Add("C")
Dim list2 As New ArrayList()
list2.Add("A")
list2.Add("B")
Dim array1 = list1.ToArray()
Dim array2 = list2.ToArray()
Dim except = array1.Except(array2).ToArray()
Also if you need a custom comparison, use this overload instead:
https://msdn.microsoft.com/en-us/library/bb336390(v=vs.110).aspx
EDIT
There are very few LINQ methods available for ArrayList, however you can convert it back very easily:
Dim arrayList as New ArrayList(except)

VB.NET - Array of Integers needs to be instantiated, how to?

First try
Dim holdValues() As Integer 'Doesn't Work
holdValues(1) = 55
Second try
Dim holdValues(-1) As Integer 'Gives me Index was outside the bounds of the array.
holdValues(1) = 55
I'm trying to do something similar to
Dim myString(-1) As String
But apparently this doesn't apply to integer arrays. I don't know what the size of the array will be, it wont get smaller but it will grow larger.
Any help will be appreciated, thank you!
You could use the Initializers shortcut:
Dim myValues As Integer() = New Integer() {55, 56, 67}
But if you want to resize the array, etc. then definately have a look at a List(Of Integer):
'Initialise the list
Dim myValues As New System.Collections.Generic.List(Of Integer)
'Shortcut to pre-populate it with known values
myValues.AddRange(New Integer() {55, 56, 57})
'Add a new value, dynamically resizing the array
myValues.Add(32)
'It probably has a method do do what you want, but if you really need an array:
myValues.ToArray()
you add the number to
holdValues(x) //x+1 will be size of array
so something like this
Dim array(2) As Integer
array(0) = 100
array(1) = 10
array(2) = 1
you can re-allocate the array to be bigger if needed by doing this.
ReDim array(10) as Integer
you'll have to add in your code when you should make your array bigger. You can also look into lists. Lists take care of this issue automatically.
here's some info on Lists: http://www.dotnetperls.com/list-vbnet
Hope this helps.
Also a link for general knowledge on arrays http://www.dotnetperls.com/array-vbnet

Short way to create arrays?

In VB.NET, I create my arrays like
Dim myArray = New ArrayList
But isn't there a way to create an array with elements without having to make a variable?
In Ruby, the long way was
array = Array.new
And the simple, non-variable way was just
[element,element,...]
Well, things you can do with primitive (and String) arrays:
Dim array As New String()
Dim array As New String() { "one", "two", "three" }
If (New String() { "one", "two", "three" }).Contains("one") Then
' Do something for "one"
End If
If you move to VB.NET 2010 you will get some extra array initialization features, but if you're using 2008 or below the shortest you can get your lists created might be something like this:
Dim list As New List(Of String)
list.AddRange(New String() { "one", "two", "three" })
And to touch on the point of declaring things without assigning them to a variable: .NET is strongly typed, so while you don't always have to declare a variable, your objects will always need to be of a single type (and one you need to specify through a New).
I'm not sure just how useful such a beast is since, without a name, you can't easily access the elements of it.
I know C has a feature that allows this with "one-shot" accesses like:
char hexchar = "0123456789abcdef"[nybble];
but, after that statement's finished the char array making up that string is no longer accessible.
If you want an array you can access continuously, I suspect it will need an identifying name. I might be wrong, I haven't used VB since VB6 but even if it's possible, it's a dubious language feature (IMO).
You can do a few things.
Public Sub Main()
Dim xs = New Integer() {1, 2, 3}
CType({1, 2, 3}, Integer()).CopyTo(...)
Dim s2 = Sum({1, 2, 3})
End Sub
Public Function Sum(ByVal array As Integer()) As Integer
Return array.Sum()
End Function
Is this the kind of thing you're after?
For Each foo As String In New String() {"one", "two", "three"} 'an array with no name - "On the first part of the journey..."
Debug.WriteLine(foo)
Next