每次调用后都需要更新哈希表

时间:2017-04-26 15:49:47

标签: c# hashtable

我需要在每个printout()方法调用之后更新我的哈希表,但每当我这样做时,它只显示最新添加的内容,而不是我已经添加了值的整个哈希表。

主:

    static void Main(string[] args)
    {
        int NOP = 0;
        Console.WriteLine("How many people to gift?");

        NOP = Convert.ToInt32(Console.ReadLine());

        for(int i=0;i<NOP;i++)
        {
            printout(NOP);
            NOP--;
        }
        Hashtable hashtable= printout(NOP);
        foreach (string key in hashtable.Keys)
        {
            Console.WriteLine(String.Format("{0}: {1}", key, hashtable[key]));
        }
        Console.Read();

    }

哈希表方法:

    public static Hashtable printout(int NOP)
    {
        Hashtable hashtable = new Hashtable();

        string[] names = new string[50];
        int[] FriendsMoney = new int[50];
        string GiftGiver = "";
        int AmountGifted = 0;
        int AmountDivider = 0;
        string[] GiftRecievers = new string[50];

        //input



        //----print names-----//
        Console.WriteLine("Names of the " + NOP + " people?");

        for (int i = 0; i < NOP; i++)
        {
            names[i] = Console.ReadLine();
        }

        //-----gift giver----//
        Console.WriteLine("Who is the gift giver?");

        GiftGiver = Console.ReadLine();

        //-------AmountGifted------------//
        Console.WriteLine("Amount to gift?");

        AmountGifted = Convert.ToInt32(Console.ReadLine());
        //--------AmountDivided----------//
        Console.WriteLine("How many people to divide gift among?");

        AmountDivider = Convert.ToInt32(Console.ReadLine());
        //----------Gift Recievers----------//
        Console.WriteLine("Names of gift recievers?");

        for (int i = 0; i < AmountDivider; i++)
        {
            GiftRecievers[i] = Console.ReadLine();
        }

        AmountGifted = AmountGifted / AmountDivider;


        for (int i = 0; i < AmountDivider; i++)
        {

            hashtable.Add(GiftRecievers[i], AmountGifted);

        }

        return hashtable;

    }

我想要的是保留旧值并在使用密钥时更新它们。

1 个答案:

答案 0 :(得分:1)

可能是因为您使用GiftRecievers[i] = Console.ReadLine();中的相同密钥与hashtable.Add(GiftRecievers[i], AmountGifted);一起使用。

使用函数hashtable.ContainsKey(GiftRecievers[i])检查是否已添加密钥。如果添加了Hashtable,则将当前项替换为新的AmountGifted

使用迭代器查看HashTable中存储了多少项而不是使用foreach(string key in hashtable.Keys)

    foreach (DictionaryEntry de in hashtable)
    {
        Console.WriteLine("{0}: {1}", de.Key, hashtable.Value);
    }

此外,在您的问题中包含一个控制台输出,以显示您输入的数据作为键和值。

更新:每次调用public static Hashtable printout(int NOP)时,您都在创建一个新的HashTable实例。如果你想使用相同的Hast表修改你的函数来接收HashTable实例作为参考,像这样:

public static void printout(ref HashTable hashtable, int NOP)
{
    //Hashtable hashtable = new Hashtable(); //It is passed as an argument

    string[] names = new string[50];
    //...

    for (int i = 0; i < AmountDivider; i++)
    {

        hashtable.Add(GiftRecievers[i], AmountGifted);

    }
   //return hashtable; //remove the return.
}

同时,在main中创建Hashtable实例并传递它引用的参数:

static void Main(string[] args)
{
    Hashtable hashtable = new Hashtable();

    int NOP = 0;
    Console.WriteLine("How many people to gift?");

    NOP = Convert.ToInt32(Console.ReadLine());

    for(int i=0;i<NOP;i++)
    {
        printout(ref hashtable, NOP);
        NOP--;
    }

    printout(ref hashtable, NOP);

    foreach (string key in hashtable.Keys)
    {
        Console.WriteLine(String.Format("{0}: {1}", key, hashtable[key]));
    }
    Console.Read();

}