在c#字典中使用对象

时间:2011-03-19 21:42:19

标签: c# dictionary

我在我的程序中使用字典

Dictionary<string, List<Term>>

哪个Term是来自class的对象有两个字段(name,id) 我需要在字典中添加新对象,在字典中找不到新对象的名称... 如果新对象中的字段名称作为旧对象的名称存在,我将不会添加它。 你能帮助我吗 我使用的代码是

 foreach (string term in terms)
    {
        if (!dictionary.ContainsKey(term))
        {
            dictionary.Add(term, new List<Term>());
        }

        Term TT=new Term(i,name);
        if (!dictionary[term].Contains(TT))
        {
            dictionary[term].Add(TT);


        }

这段代码不能正常工作..

3 个答案:

答案 0 :(得分:6)

问题在于:

    if (!dictionary[term].Contains(TT))
    {
        dictionary[term].Add(TT);
    }

如果类Term未实现IEquatable<Term>List.Contains的默认行为是检查引用相等性。由于您刚刚构建的对象不在列表中,Contains将始终返回false,并且将始终添加新的Term

一个好的解决方案是在Term中实施IEquatable<Term>,并在IEquatable<Term>.Equals方法中指定您想要的相等标准。

另一种解决方案(可能不太理想,因为它只能帮助这段特定代码工作)是将测试更改为

    // Change the t.name == TT.name test to whatever your idea
    // of "term X equals term Y" is
    if (dictionary[term].FindIndex(t => t.name == TT.name) == -1)
    {
        dictionary[term].Add(TT);
    }

答案 1 :(得分:1)

我假设一个术语对象由它的id标识。因此,您需要在术语类上实现IEquatable<Term>,或者查找具有正确ID的术语,如下所示:

if (!dictionary[term].Any(x => x.Id == TT.id))
{
    dictionary[term].Add(TT);
}

注意:任何是Linq扩展方法,因此您需要添加using System.Linq;

答案 2 :(得分:-1)

static void Main(string[] args)
    {
        //Database producten

        Dictionary<string, double> producten = new Dictionary<string, double>();
        Console.WriteLine("Dit zijn de beschikbare producten");
        producten.Add("T-shirt", 45.35);
        Console.WriteLine("T-shirt");
        producten.Add("trui", 25.50);
        Console.WriteLine("trui");
        producten.Add("broek" , 90);
        Console.WriteLine("broek");

        //Einde database
        //Console.WriteLine(producten["trui"]);

        double tot = 0;
        bool boot = true;
        Dictionary<string, int> winkelmandje = new Dictionary<string, int>();

        while (boot)
        {
            Console.WriteLine("Wilt u een product toevoegen?, ja of nee?");
            string answer = Console.ReadLine();
            if (answer == "ja")
            {
                Console.WriteLine("Geef de naam van het product?:");
                string naam = Console.ReadLine();

                Console.WriteLine("Hoeveel aantallen wenst u van dit product?:");
                int inthvl = Convert.ToInt32(Console.ReadLine());

                winkelmandje.Add(naam, inthvl);

            }

            if (answer == "nee")
            {
                foreach(KeyValuePair<string, int> product in winkelmandje)
                {
                    if (producten.ContainsKey(product.Key))
                    {
                        tot = tot + producten[product.Key] * product.Value;
                    }
                    else
                    {
                        Console.WriteLine("Dit product verkopen wij niet.");
                    }
                }
                boot = true;
                Console.WriteLine("Gelieve " + tot + " euro te betalen.");

            }