2016-12-21 3 views
1

Учитывая массив строк, скажем: Dim array1 As String() = {"1", "2", "3"} Каков наилучший способ скопировать этот массив и выполнить действие для каждого элемента?VB.Net эквивалент функции Javascript .Map

Другими словами, что это лучший способ, чтобы скопировать этот массив, чтобы придумать: array2 as integer() = {1, 2, 3}

К примеру, нечто похожее на 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 

Если это не представляется возможным в одном line - как я подозреваю, это не так - какова ваша самая быстрая альтернатива? Благодаря!

+0

http://stackoverflow.com/questions/31008744/how-to-implement-map-function-in-vb-net –

ответ

4

Если вы не хотите использовать любые методы расширения LINQ, но вы все в порядке с помощью лямбда-выражения, вы можете сделать это в одной строке с помощью Array.ConvertAll:

Dim input() As String = {"1", "2", "3"} 
Dim output() As Integer = Array.ConvertAll(input, Function(x) Integer.Parse(x)) 

Однако это умоляю вопрос: почему бы не использовать LINQ, в этот момент, так как это фактически то же самое, что:

Dim input() As String = {"1", "2", "3"} 
Dim output() As Integer = input.Select(Function(x) Integer.Parse(x)).ToArray() 
+0

Спасибо за быстрый ответ, мне нравится ваш ответ. Я не выбрал Linq просто потому, что еще не разобрался с ним и хотел увидеть ответы, которые люди могли придумать, а не Linq. Спасибо за добавление запроса Linq, хотя это полезно. Я отредактирую свой вопрос, чтобы включить запросы Linq. – Rhurac

1

Если вы не хотите использовать LINQ здесь является классическим способом, петля:

Dim numbers = {4, 9, 16, 25} 
For i As Int32 = 0 To numbers.Length - 1 
    numbers(i) = CInt(Math.Sqrt(numbers(i))) 
Next 
3

Я хотел бы добавить, что, подобно JavaScript, карта .NET в эквивалент Select также поддерживает метод групп, а также лямбды.

Ниже приведен пример с использованием лямбда:

Dim output = input.Select(Function(x) SomeMethod(x)).ToArray() 

Ниже приведен пример с использованием метода группы. Так как скобка на вызовах методов не является обязательной в VB.NET, требуется дополнительное AddressOf ключевого слова:

Dim output = input.Select(AddressOf SomeMethod).ToArray() 

Для полноты, вот пример с использованием синтаксиса запросов LINQ, который является просто синтаксическим сахаром для первого примера:

Dim output = (From x In input Select SomeMethod(x)).ToArray() 
+0

Спасибо, это очень полезная информация. Мне не было известно о – Rhurac

+0

@Rhurac, то же самое относится к 'Array.Convert'. Любой метод, который имеет делегат для параметра, может быть задан либо делегированным объектом (например, «AddressOf SomeMethod»), либо встроенным лямбда-выражением в качестве аргумента –