использовать объект в словаре C # - PullRequest
1 голос
/ 20 марта 2011

Я использую словарь в своей программе следующим образом:

Dictionary<string, List<Term>>

, термин которого является объектом из класса, имеет два поля (имя, идентификатор). Мне нужно добавить новый объект в словарь, в котором имя нового объекта не найденов словаре ... если имя поля в новом объекте существует как имя старого объекта, я не буду его добавлять .. можете ли вы помочь мне код, который я использую, это

 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 ]

6 голосов
/ 20 марта 2011

Проблема здесь:

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

Поведение по умолчанию List.Contains, если класс Term не реализует IEquatable<Term>, заключается в проверке на равенство ссылок. Поскольку только что созданный объект уже не может быть в списке, Contains всегда будет возвращать false, а новый Term всегда будет добавляться.

Одним хорошим решением было бы внедрить IEquatable<Term> в 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 голос
/ 20 марта 2011

Я предполагаю, что термин «объект» идентифицируется по его идентификатору.Поэтому вам нужно либо внедрить IEquatable<Term> в классе терминов, либо искать термин с правильным идентификатором, например:

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

Примечание: Any - это метод расширения Linq, поэтому вам нужно добавить using System.Linq;

0 голосов
/ 15 декабря 2017
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.");

            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...