fellanmorgh Ответов: 3

Сравните два элемента в списке в одном индексе.


У меня есть список
List<Person> people = new List<>


Объект персона выглядит следующим образом:
public string Name{ get; set; }
public string Surname{ get; set; }


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

Как я мог сравнить два значения имени и фамилии?
например, список с индексом 0 имеет:
Имя = "бла-бла"
Фамилия = "не-а"

Например: если имя " бла "совпадает с тем же индексом, что и фамилия "нах", сделайте что-нибудь.

РЕДАКТИРОВАТЬ:

Допустим, у меня есть два текстовых поля, одно текстовое поле отображает имя, и пользователь должен ввести фамилию. Фамилия должна соответствовать тому же индексу, что и имя. Поэтому, если имя - "бла", а пользователь вводит Фамилию, которая уже " нах " (в том же индексе), то сделайте что-нибудь, например, отобразите MessageBox. Вы можете относиться к этому как к игре в угадайку, какова его фамилия/имя.

Я забыл упомянуть, что элемент списка генерируется случайным образом. Вот этот код:

randomPerson= people[random.Next(people.Count)];
string result = RandomlyGenerated(random);


Это случайный метод:

private string RandomlyGenerated(Random r)
        {
            if (random.Next(1) == 0)
            {
                txtName.Text = randomPerson.Name;
                return randomPerson.Name;
            }
            else
            {
                txtSurname.Text = randomPerson.Surname;
                return randomPerson.Surname;
            }
        }


Может быть, так будет понятнее. В основном, если txtName отображает текст. Пользователь должен угадать, что такое соответствующая фамилия, которая находится в том же индексе, что и имя, которое было отображено на экране.

Итак, если мы имеем в индексе 0:
Имя = 'бла'
Фамилия = "не-а"

Пользователь должен ввести "nah" в качестве фамилии, чтобы, например, появилось окно сообщения. Надеюсь, теперь это сделает его более ясным.

Все еще борясь с этим :/.

BillWoodruff

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

Это две разные цели.

Karthik_Mahalingam

Каков ваш ожидаемый результат?
Опубликуйте некоторые примеры данных..
Вопрос не ясен..

3 Ответов

Рейтинг:
21

BillWoodruff

Примечание: этот код был написан быстро, и, хотя он компилируется, я не проверил его полностью.

Во-первых, если ваш код создает список экземпляров 'Person и вы хотите применить какое-то правило отбора имен, вот пример:

public class Person
{
    private static List<string> surnamesInUse = new List<string>();
    private static List<string> firstNamesInUse = new List<string>();

    private string lname;
    private string lsurname;

    public Person(string name, string surname)
    {
        if (name == String.Empty || surname == String.Empty)
        {
            throw new ArgumentException($"name and surname cannot be empty strings");
        }

        lname = name.ToLower();
        lsurname = surname.ToLower();

        if (lname == lsurname)
        {
            throw new ArgumentException($"name and surname cannot match independent of case");
        }

        if (firstNamesInUse.Contains(lname))
        {
           throw new DuplicateNameException($"{name} is already in use as a first name");
        }

        if (firstNamesInUse.Contains(lsurname))
        {
            throw new DuplicateNameException($"{surname} is already in use as a first name");
        }

        if (surnamesInUse.Contains(lname))
        {
            throw new DuplicateNameException($"{name} is already in use as a surname");
        }

        if (surnamesInUse.Contains(lsurname))
        {
            throw new DuplicateNameException($"{surname} is already in use as a surname");
        }

        surnamesInUse.Add(lsurname);
        firstNamesInUse.Add(lname);

        Name = name;
        Surname = surname;
    }

    public string Name { get; set; }
    public string Surname { get; set; }

    public bool Equals(Person p2)
    {
        return
            lname == p2.Name.ToLower()
            &&
            lsurname == p2.Surname.ToLower();
    }
}
Если вы не создавали экземпляры 'Person, а хотите поискать совпадения, вот несколько идей:
public enum MatchType
{
    NoMatch,
    SurnameMatch,
    FirstNameMatch,
    BothNameMatch
}

public static class PersonMatcher
{
    public static MatchType ComparePersons(Person p1, Person p2)
    {
        if (p1.Surname == p2.Surname)
        {
            if (p1.Name == p2.Name) return MatchType.BothNameMatch;

            return MatchType.SurnameMatch;
        }

        if (p1.Name == p2.Name) return MatchType.FirstNameMatch;

        return MatchType.NoMatch;
    }

    public static bool IsUnique(Person p1, List<Person> persons)
    {
        return ! persons.Any(p2 => (! p2.Equals(p1)) && ComparePersons(p2, p1) != MatchType.NoMatch);
    }

    public static IEnumerable<Person> GetDistinct(List<Person> persons)
    {
        return persons.Where(p1 => IsUnique(p1, persons));
    }

    public static List<Person> GetNotMatching(Person p1, List<Person> ps)
    {
        return ps.Where(p2 => (!p2.Equals(p1)) && ComparePersons(p1, p2) == MatchType.NoMatch).ToList();
    }

    public static List<Person> GetSurnameMatches(Person p1, List<Person> ps)
    {
        return ps.Where(p2 => (!p2.Equals(p1)) && ComparePersons(p1, p2) == MatchType.SurnameMatch).ToList();
    }

    public static List<Person> GetFirstNameMatches(Person p1, List<Person> ps)
    {
        return ps.Where(p2 => (!p2.Equals(p1)) && ComparePersons(p1, p2) == MatchType.FirstNameMatch).ToList();
    }

    public static List<Person> GetDuplicates(Person p1, List<Person> ps)
    {
        return ps.Where(p2 => (!p2.Equals(p1)) && ComparePersons(p1, p2) == MatchType.BothNameMatch).ToList();
    }
}
Вы можете легко превратить эти методы в методы расширения и/или изменить их для сравнения без чувствительность к регистру через преобразование в нижний регистр.


fellanmorgh

Привет, это не то, что я искал. В любом случае мне удалось заставить его работать...все равно спасибо за этот код. Это натолкнуло меня на мысль добавить в программу какой-нибудь полезный код! :)

BillWoodruff

Рад, что вы нашли код полезным в некотором роде !

Рейтинг:
2

Peter Leow

Что-то похожее на это:

foreach (Person person in people)
{
    if (person.Name == person.Surname)
    {
        // do something..
    }
}

кроме того, проверить этот Как создать список объектов в C#[^]


Рейтинг:
12

Karthik_Mahalingam

обратитесь к комментариям в строке

int index = 2;  // for the index to be checked
if (lst.Count > index)  // validate the index
{
    Person obj = lst[index]; // index of the person in the list
    if (obj.Name == obj.Surname) // compare the Name and Surname
    {
        // match
    }
    {
        // not equal
    }
}


fellanmorgh

Привет, ваше решение на самом деле было самым близким. Просто нужно было немного поиграть с ним. Я просто слишком много думал об этом. Спасибо! :)

Karthik_Mahalingam

Добро пожаловать