将VB中的Do Until循环转换为C#

3

我需要将VB代码转换成C#代码。

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 while循环

do
{
    s = Replace(s, Token, Values(i),  , 1)
    i = i + 1;
    MarkerPos = Strings.InStr(s, Token);
} while(MarkerPos = 0 || i > UBound(Values));

在C#中是否有类似于UBound的功能?请问我的理解是否正确?


你想做什么 - 如果你解释一下目标,我认为你可能可以做得更好。 - Dave Bish
1
"Do Until ..."类似于while(!(...))。此外,在循环的开头翻转while逻辑,而不是在结尾翻转。 - the_lotus
1
我不知道为什么会得到这些负分..!答案也被发布了。 - Dah Sra
6个回答

2

在C#数组中,您可以简单地使用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

编辑2:

你的逻辑应该是“与(AND)”:

while(MarkerPos = 0 && i < Values.Length-1);

UBound = "上限",所以是的。 - Dave Bish
@Arshad:UBound等于Length或Count减去1。 UBound是数组的最高索引,而不是长度。 - Dave Doknjas
我认为你不能使用do ... while。在这种情况下,循环内的代码将至少执行一次,而在原始的VB代码中,有可能代码根本不会执行。 - Chris Dunaway

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);
        }
    }
}

0

如“the_lotus”在评论中提到的,最自然等价的循环是“while(!”循环:

while (!(MarkerPos == 0 || i > Values.GetUpperBound(0)))
{
    s = ...
    i = i + 1;
    MarkerPos = (s.IndexOf(Token) + 1);
}

请注意我已经省略了“替换”等效项——您正在使用的VB“替换”方法没有直接的等效项,但您可以验证常规字符串“替换”方法是否足够。

-1

C# 中没有 ubound。您可以使用类似 Values.Length 的东西,其中 Values 是您的字符串数组。


不完全正确。如果您添加了对VisualBasic命名空间的引用,那么您可以在其中使用Ubound函数。 - Matt Wilko
请注意,'UBound' 给出的是最高索引,这与 'Length' 不同(UBound = Length - 1)。 - Dave Doknjas

-1

-1

你可以写:

do
{
    ...
} while(MarkerPos != 0 && i < Values.Length);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接