дедупликация списка на основе части класса - PullRequest
1 голос
/ 19 марта 2020

У меня есть List<Person> и я хочу удалить дубликаты на основе поля NPI.

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

Неважно, какие дубликаты удаляются из списка, если не осталось дубликатов NPI.

class Person
{
    string NPI;
    string Address;

    public string getNPI()
    {
        return NPI;
    }

    public Person(String npi, String address)
    {
        this.NPI = npi;
        this.Address = address;
    }
}

1 Ответ

1 голос
/ 19 марта 2020

Если вы хотите выбрать все элементы, которые имеют пустые поля NPI, вместе с уникальными полями NPI из остальных, вы можете использовать предложение GroupBy вместе с некоторыми проверками на пустые значения NPI:

var people = new List<Person>
{
    new Person ("dupe", "dupe npi"),
    new Person ("dupe", "another dupe npi"),
    new Person ("", "empty npi"),
    new Person ("", "another empty npi"),
    new Person ("unique", "unique npi")
};

var uniqueAndBlank = people
    .Where(p => string.IsNullOrEmpty(p.getNPI()))      // Get all the empty NPIs
    .Concat(people                                     // Concat with other items
        .Where(p => !string.IsNullOrEmpty(p.getNPI())) // Whose NPIs are set
        .GroupBy(p => p.getNPI())                      // Grouped by their NPI fields
        .Select(g => g.First()))                       // Grab the first item
    .ToList();

// Result:
// {{ "", "empty npi" },
//  { "", "another empty npi" },
//  { "dupe", "dupe npi" },
//  { "unique", "unique npi" }}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...