Мне нужно преобразовать код VB в С#
Do Until MarkerPos = 0 Or i > UBound(Values)
s = Replace(s, Token, Values(i), , 1)
i = i + 1;
MarkerPos = Strings.InStr(s, Token);
Loop
и я преобразовал его, чтобы сделать, пока
do
{
s = Replace(s, Token, Values(i), , 1)
i = i + 1;
MarkerPos = Strings.InStr(s, Token);
} while(MarkerPos = 0 || i > UBound(Values));
это правильно и есть ли что-то подобное, связанное с UBound в С#.???
Вы можете просто использовать values.Length
чтобы возвращать количество элементов в массиве С#:
do
{
s = Replace(s, Token, Values(i), , 1)
i = i + 1;
MarkerPos = Strings.InStr(s, Token);
}
while(MarkerPos = 0 || i > Values.Length -1);
(Вы также можете использовать .Count()
для любого другого перечислимого типа)
РЕДАКТИРОВАТЬ:
Кроме того, я думаю, что ваше состояние может быть неправильным:
i < Values.Length -1
EDIT2:
и ваша логика, вероятно, должна быть И:
while(MarkerPos = 0 && i < Values.Length-1);
если у вас есть массив из 10 элементов, Ubound
вернет 10, а Length
вернет 11.
вы можете использовать .GetUpperBound(0)
или .Lenght-1
доказательство
using System;
using Microsoft.VisualBasic;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var ar = new string[11];
Console.WriteLine(ar.GetUpperBound(0));
Console.WriteLine(ar.Length);
Console.WriteLine(Microsoft.VisualBasic.Information.UBound(ar));
Console.ReadKey();
}
}
}
поэтому с помощью этого ответа
это то, что вам нужно, я думаю
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string s = "123412341234";
string Token = "2";
var Values = new string[] {"a","b", "c" };
int i = 0;
int MarkerPos;
do
{
s = ReplaceFirst(s, Token, Values[i]);
MarkerPos = s.IndexOf(Token);
i++;
} while(MarkerPos != -1 && i <= Values.GetUpperBound(0));
Console.WriteLine(s);
Console.ReadKey();
}
static string ReplaceFirst(string text, string search, string replace)
{
int pos = text.IndexOf(search);
if (pos < 0)
{
return text;
}
return text.Substring(0, pos) + replace + text.Substring(pos + search.Length);
}
}
}
Как упоминалось в комментарии 'the_lotus', цикл, который является наиболее естественным эквивалентом, представляет собой цикл while (! ":
while (!(MarkerPos == 0 || i > Values.GetUpperBound(0)))
{
s = ...
i = i + 1;
MarkerPos = (s.IndexOf(Token) + 1);
}
Обратите внимание, что я оставил эквивалент "Заменить" - версия используемого вами метода VB "Заменить" не имеет прямого эквивалента, но вы, вероятно, можете проверить, будет ли метод регулярной строки "Заменить" адекватным или нет.
Ты можешь написать:
do
{
...
} while(MarkerPos != 0 && i < Values.Length);
Нет ubound в С#. Вы можете использовать что-то наподобие Values.Length, где Values - ваш строковый массив.
Я использовал эту страницу несколько раз, она может конвертировать наоборот: конвертировать vb.net в С# или С# в vb.net - developerfusion.com
Он также поддерживает python и ruby.