【问题标题】:I can not add in Hashtable我不能在哈希表中添加
【发布时间】:2015-07-03 05:07:12
【问题描述】:

首先,对不起我的英语不好。

我有这个:

public static Users server = new Users();

static void Main(string[] args)
{
    server.addNewUser(1, "John");
    server.addNewUser(2, "Marlon");
    server.addNewUser(3, "Lucas");
    Console.WriteLine(server.countUsers()); //COUNT USERS

    TcpManager manager = new TcpManager(58636, 500);

    Console.Read();
}

TcpManager:

public Users test = new Users();
internal TcpManager(int port, int maxuserson)
{
    test.addNewUser(4, "Julio");
    test.addNewUser(5, "Marcelo");
    test.addNewUser(6, "Andre");
    Console.WriteLine(test.countUsers()); //COUNT USERS
}

和我的用户类:

class Users
{
    Hashtable users = new Hashtable();

    public void addNewUser(int id, string name)
    {
        if (!users.ContainsKey(id))
            users.Add(id, name);
        else users[id] = name;
    }

    public int countUsers()
    {
        return users.Count;
    }
}

我的问题是,当我在 Main 上添加一个用户时,它可以工作! 但是当我尝试在 TcpManager 中做同样的事情时,他根本没有添加。

如何让它发挥作用? 我尝试了 List、Dictionary、Tuple,都遇到了同样的问题。

我的第一个 ConsoleWrite 返回“3”,第二个在 TcpManager 中也返回“3”,什么时候应该返回“6”。

谢谢大家,再一次,对不起我的英语。

【问题讨论】:

  • 为什么要返回 6?对象 test 和 server 是独立的,具有独立的哈希表。添加到一个不会添加到另一个?
  • main方法和TcpManager使用了Users的不同实例。 main 方法使用静态实例,而 TcpManager 使用本地成员实例。第一次从 TcpManager 调用时,哈希表是空的。将静态实例传递给TcpManager,它应该可以工作。
  • 我正在尝试创建一个可以在代码中的任何位置访问和添加的用户列表,我尝试在 TcpManager 中创建一个 STATIC VOID,然后添加用户,但不起作用..
  • 我有没有更简单的方法来创建来自多个用户的数据列表?

标签: c# hashtable


【解决方案1】:

您将Users 类中的哈希表声明为实例字段。这意味着Users 的每个实例都有自己的哈希表。因此,您的程序的行为与预期的一样。

有几种方法可以让它按照您想要的方式工作。

Users设为静态

static class Users
{
    private static Hashtable users;

    static Users()
    {
       users = new Hashtable();
    }

    public static void addNewUser(int id, string name)
    {
        if (!users.ContainsKey(id))
            users.Add(id, name);
        else users[id] = name;
    }

    public static int countUsers()
    {
        return users.Count;
    }    
}

用法

Users.addNewUser(1, "Vera");
Console.WriteLine(Users.countUsers());

使用用户 Hashable 静态(本质上,这是 Monostate-Pattern)

class Users
{
    private static Hashtable users = new HashTable();

    public void addNewUser(int id, string name)
    {
        if (!users.ContainsKey(id))
            users.Add(id, name);
        else users[id] = name;
    }

    public int countUsers()
    {
        return users.Count;
    }    
}

用法

var users = new Users();
users .addNewUser(1, "Vera");
Console.WriteLine(users.countUsers());

使用单例

class Users
{
    private Hashtable users;

    private static Users instance;

    private Users()
    {
         users = new HashTable();
    }

    public static Users Instance 
    {
        get
        {
            if (instance == null)
                instance=new Users();
            return instance;
        }
    }

    public void addNewUser(int id, string name)
    {
        if (!users.ContainsKey(id))
            users.Add(id, name);
        else users[id] = name;
    }

    public int countUsers()
    {
        return users.Count;
    }    
}

用法

Users.Instance 是唯一将被创建的用户实例,因为 ctor 是私有的并且仅在 Instance-Property 中使用。

var users = Users.Instance;
users.addNewUser(1, "Vera");
users.countUsers();

【讨论】:

  • 天哪,我什么都试过了,这行得通。非常感谢! :D
  • 我会在我的回答中添加更多内容以供您注意,还有一些其他问题
  • 再次感谢您.. 现在变得容易多了,
【解决方案2】:

试试这个方法:

TcpManager manager = new TcpManager(58636, 500);

test.addNewUser(4, "Julio");
test.addNewUser(5, "Marcelo");
test.addNewUser(6, "Andre");

Console.WriteLine(manager.test.countUsers()); // 6

在 TcpManager 构造函数中:

internal TcpManager(int port, int maxuserson)
{
    // This code will executed when you call  new TcpManager();
    // So, you have to add 1, 2 and 3 ids first.
    manager.test.addNewUser(1, "John");
    manager.test.addNewUser(2, "Marlon");
    manager.test.addNewUser(3, "Lucas");
    Console.WriteLine(test.countUsers()); //COUNT USERS: 3
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    • 2020-11-17
    • 2011-06-21
    相关资源
    最近更新 更多