mutasadiq iqbal Ответов: 3

Функция поиска с использованием словаря на языке Си#


Привет Ребята,
Я сделал словарь определяемой пользователем функции Person. Я хочу проверить данные из словаря, присутствуют ли они в словаре или нет.я использую функцию словаря содержит значение, чтобы проверить, присутствует ли оно в словаре или нет.
но это не поиск от него.

Что я уже пробовал:

public bool SearchPerson(Dictionary<int, Person> dict,Person pr)
       {


               if (dict.ContainsValue(pr)== true)
               {
                   Console.WriteLine("Successfully found");

                   return true;
               }

               return false;

       }


основная функция

Person nam = new Person();

                   nam.setName(name);

                   nam.SearchPerson(dictionary,nam);



Установить и получить методы класса Person
public void setName(string name)
        {
            Console.WriteLine("Please Enter the name of the Person");
            name = Console.ReadLine();
            this.name = name;

        }
        public string getName(Person p)
        {
            return this.name;
        }

Chris Copeland

Я не вижу в предоставленном вами коде, где вы на самом деле добавляете объект person в словарь?

Richard MacCutchan

Где находится код, который вставляет записи в словарь?

3 Ответов

Рейтинг:
2

F-ES Sitecore

Некоторые из ваших кодов не имеют большого смысла, но для этого кода я обновил ваше имя набора

public void setName(string name)
{
    Console.WriteLine("Please Enter the name of the Person");
    this.name = name;
}


Нет никакого смысла передавать "имя", чтобы оно просто было переопределено консольным вводом.

Ваш словарь не находит ваш объект, потому что он ищет реальный объект, который вы ему даете

Dictionary<int, Person> dictionary = new Dictionary<int, Person>();

Person personJohn = new Person();
personJohn.setName("John");
dictionary.Add(1, personJohn);

Person personDave = new Person();
personDave.setName("Dave");
dictionary.Add(2, personDave);


Person nam = new Person();
bool success = nam.SearchPerson(dictionary, personJohn);

// success is true because we are looking for an object (personJohn) that is in the dictionary

Person tempPerson = new Person();
tempPerson.name = "John";

success = nam.SearchPerson(dictionary, tempPerson);

// success is false because "tempPerson" isn't in the dictionary
// even though it has the same "name" as an object in the dictionary
// the code doesn't know that constitutes a match


Однако вы не хотите, чтобы ваш код работал на уровне объекта, вас интересует только сопоставление значений свойств, а не сопоставление объектов. Вы можете обновить свою функцию поиска следующим образом

public bool SearchPerson(Dictionary<int, Person> dict, Person pr)
{

    if (dict.Values.Any(p => p.name == pr.name))
    {
        Console.WriteLine("Successfully found");

        return true;
    }

    return false;

}


Другим решением является создание пользовательского компаратора, который сообщает коду, что два объекта эквивалентны, если свойства имени одинаковы.

public class PersonComparer : IEqualityComparer<Person>
{
    public bool Equals(Person x, Person y)
    {
        if (x == null || x.name == null || y == null || y.name == null)
        {
            return false;
        }

        return x.name.Equals(y.name);
    }

    public int GetHashCode(Person obj)
    {
        return obj.name.GetHashCode();
    }
}


Теперь ваша функция поиска будет выглядеть следующим образом

public bool SearchPerson(Dictionary<int, Person> dict, Person pr)
{

    if (dict.Values.Contains(pr, new PersonComparer()))
    {
        Console.WriteLine("Successfully found");

        return true;
    }

    return false;

}


Рейтинг:
1

OriginalGriff

Причина, по которой это не работает для вас, заключается в том, что вы не добавляете nam для вашего словаря, и поскольку вы сравниваете экземпляры, это должен быть точный экземпляр, а не просто один с тем же именем свойства.
Добавьте его, и он будет работать:

Person nam = new Person();
nam.setName(name);
dictionary.Add(nam);
nam.SearchPerson(dictionary,nam);
Но... Это довольно запутанный код.
Либо поисковик должен быть static и вы называете его через имя класса:
if (Person.SearchPerson(dictionary, nam))
   {
   ...
Или вы ищете текущий элемент, а не передаете экземпляр через него:
public bool SearchPerson(Dictionary<int, Person> dict)
    {
    if (dict.ContainsValue(this))
        {
        Console.WriteLine("Successfully found");
        return true;
        }
    return false;
    }
Но я бы, вероятно, вообще не сделал этот метод частью класса Person, поскольку он опирается на структуры вне класса - словарь<int, Person>


Рейтинг:
0

CPallini

Вы должны определить равенство значений для Person класс. Видеть Как определить равенство значений для типа - руководство по программированию на C# | Microsoft Docs[^].