C#用do循环替换do..while

时间:2018-02-09 03:59:02

标签: c# for-loop do-while

我通常知道如何用for循环替换do..while循环,但在这种情况下,变量check2对于不同的循环使用了2次,让我对如何正确地用for循环替换它感到困惑。

public static void RelayChat(ref int con, ref string Message)
{
    string temp_SubName = "relaychat";
    WriteSub(ref temp_SubName);
    int check2 = 0;

    if (Message.Length == 0) return;

    var check = UserConToCheck(con);

    if (CheckMute(get_UserName(check)) || get_UserChat(check) > 4) return;

    if (get_UserChat(check) < 8) set_UserChat(check, get_UserChat(check) + 1);

    if (Message.Length > 100) Message = Message.Substring(0, 99);

    if (Message[0] == '!')
    {
        if (UserCommand(con, Message.Substring(1).Split(" ".ToCharArray()))) return;
    }

    if (PlayerAdapter.get_Reference(check).get_IsAdmin(1))
    {
        if (Message.Substring(0, 1) == "@")
        {
            string[] temp_cmds = Message.Substring(1).Split(",".ToCharArray());
            admin.AdminCommand(PlayerAdapter.get_Reference(check), ref temp_cmds);
            return;
        }
    }

    if (Message.StartsWith(":g::", true, null))
    {
        do
        {
            check2++;
            var guild1 = get_UserGuild(check);
            var guild2 = get_UserGuild(check2);
            if (guild1 == null || guild2 == null || guild1.ToLower() != guild2.ToLower()) continue;
            var thisuser = get_UserName(check);
            var targetuser = get_UserName(check2);
            var found = targetuser != null && thisuser != null && 
                        IgnoreUserList.ContainsKey(targetuser) && 
                        IgnoreUserList[targetuser].Contains(thisuser);

            if (found == false)
            {
                Winsock.PrivMsg(get_UserCon(check2), "14,1,[ " + get_UserGuild(check2) + " ] Chat - " + get_UserName(check) + " : " + Message.Substring(4));
            }
        } while (check2 != UserMax);
        return;
    }

    if (check <= 0) return;

        do
        {
            check2++;

            bool found = false;

            var user = get_UserName(check2);
            if (user != null && IgnoreUserList.ContainsKey(user))
            {
                found = Convert.ToBoolean(IgnoreUserList[get_UserName(check2)].Contains(get_UserName(check)));
            }

            if (found) return;

            if (get_UserLanded(check2) != get_UserLanded(check)) return;

            if (get_UserLanded(check2))
            {
                if (get_UserInBar(check2) == false &&
                    get_UserInUniversalBar(check2) == false) return;

                if (get_UserInUniversalBar(check2) && get_UserInUniversalBar(check))
                {
                    Winsock.PrivMsg(get_UserCon(check2), "13,0,[ " + get_UserName(check) + " ] : " + Message);
                }
                else if (get_UserInBar(check2) && get_UserInBar(check))
                {
                    if (get_UserLastPlanet(check2) !=
                        get_UserLastPlanet(check)) return;

                    Winsock.PrivMsg(get_UserCon(check2), "13,0,[ " + get_UserName(check) + " ] : " + Message);
                }
            }
            else if (get_UserLanded(check2) == false)
            {
                if (get_UserSector(check2) != get_UserSector(check)) return;

                if (get_UserZone(check2) != get_UserZone(check)) return;

                Winsock.PrivMsg(get_UserCon(check2), "13,0,[ " + get_UserName(check) + " ] : " + Message);
            }

        } while (check2 != UserMax);
}

我知道这个函数可能很复杂,但请忽略这个事实并专注于do..while循环。谢谢!

1 个答案:

答案 0 :(得分:0)

只需声明for循环即可使用现有变量。

int check2 = 0;

if (Message.StartsWith(":g::", true, null))
{
    for (; check2 < UserMax; check2++)
    {
        // Do stuff
    }
    return;
}

if (check <= 0) return;

for (; check2 < 200; check2++)
{
    // Do stuff
}