3
class Myclass
{
    static string[] user_Name = { "admin", "user1", "user2" };
    static string[] user_Password ={ "admin", "123", "789" };

    public static void Check_Method(string u_name, string u_password)
    {

        for (int i = 0; i < user_Name.Length; i++)
        {
            if (u_name == user_Name[i] && u_password == user_Password[i])
            {
                MessageBox.Show("login successful");
                break;
            }
            else
            {
                if (i == (user_Name.Length - 1))
                    MessageBox.Show("Badshow");
            }
        }
    }
    public static void add_user(string name, string password)
    {
        i=user_Name.Length;
        user_Name[i]=name;
        user_Password[i]=password;
        //here i want to add another user but im unable to find the way
    }
}

しかし、配列の境界の外にあるというエラーが発生します。

このアクションを実行する最も便利な方法は何ですか?

4

5 に答える 5

7

可変サイズのストレージが必要な場合は、配列を使用しないでください。

List<string>代わりに使用してください - アイテムを許可しますAdd


あなたの場合、各ユーザーには常に対応するパスワードがあるため、2 つのアレイの選択には疑問があります。これは、ユーザーとパスワードのペアを保持するためのカスタム クラスが必要であることを示唆しています。

このようなクラス (たとえばUser) を使用すると、 を保持しList<User>てコードを簡素化できます。

于 2013-03-05T19:51:46.443 に答える
2

を使用してみてくださいList<>

class Myclass
{
    static List<string> user_Name = new List<string>{ "admin", "user1", "user2" };
    static List<string> user_Password = new List<string>{ "admin", "123", "789" };

    public static void Check_Method(string u_name, string u_password)
    {

        for (int i = 0; i < user_Name.Length; i++)
        {
            if (u_name == user_Name[i] && u_password == user_Password[i])
            {
                MessageBox.Show("login successful");
                break;
            }
            else
            {
                if (i == (user_Name.Length - 1))
                    MessageBox.Show("Badshow");
            }
        }
    }
    public static void add_user(string name, string password)
    {
        user_Name.Add(name);
        user_Password.Add(password);
    }
}

リファクタリングされたバージョンは次のとおりです。

ユーザーはユーザー クラスに含まれます。

これらはIEquatable<>、ユーザー名/パスワードを比較するものです (Guidそれらを一意に保つために、を検討することを検討することをお勧めします)。

ユーザーを簡単に追加/削除します。

public class User : IEquatable<User>
{
    public User(string name, string password)
    {
        Name = name;
        Password = password;
    }

    public string Name { get; set; }
    public string Password { get; set; }

    public bool Equals(User other)
    {
        if (other == null) return false;

        return other.Name == Name && other.Password == Password;
    }
}

public class AuthenticationManager
{
    private List<User> LoggedInUsers = new List<User>
    { new User("Admin", "admin"), new User ("user1", "123"), new User ("user2", "789") };

    public bool Authenticate(string userName, string password)
    {
        var user = new User(userName, password);

        //if the user is in the list it will return false otherwise true.
        return !LoggedInUsers.Any(u => user.Equals(user)); 
    }

    public void Login(string name, string password)
    {
        LoggedInUsers.Add(new User(name, password));
    }

    public void Logout(string name, string password)
    {
        LoggedInUsers.Remove(new User(name, password));
    }
}
于 2013-03-05T19:53:43.983 に答える
0

List倍数の代わりにDTOを使用して適用してみませんstring[]か?

次のようなものを試してください。

1)ユーザーのDTOを作成します。

public class UserDTO
{
    public string UserName { get; set; }
    public string Password { get; set; }    
}

2)使用およびList<DTO>

class Myclass
{
    static List<UserDTO> users = new List<UserDTO>()
    {
        new UserDTO() { UserName= "admin", Password = "admin" } ,
        new UserDTO() { UserName= "user1", Password = "123" } ,
        new UserDTO() { UserName= "user2", Password = "789" } ,
    }

    public static void Check_Method(string u_name, string u_password)
    {
        if (users.Exists(x => x.UserName == u_name && x.Password == u_password)
        {
               MessageBox.Show("login successful");
        }
        else
        {
            MessageBox.Show("Badshow");
        }
    }
    public static void add_user(string name, string password)
    {
        users.Add(new UserDTO() { UserName= name, Password = password });
    }
}
于 2013-03-05T19:55:51.213 に答える
0

List<string>代わりにクラスを使用してみてくださいstring[]

object.Add()メソッドを使用して配列にアイテムを追加します

于 2013-03-05T19:56:15.520 に答える
0

さて、あなたはこれについて間違った方法で考えているのではないかと思います。配列を使用している方法は、オブジェクトを求めて叫んでいます。

User をそのようなオブジェクトにします

public class User 
{
  public string UserName { get; set;}
  public string Password { get; set;}
}

次に、代わりにユーザーのリストを維持します。そうすれば、配列インデックスを維持する必要がなくなり、新しいユーザーをリストに簡単に追加できます。

于 2013-03-05T19:54:34.970 に答える