Преобразуйте список в словарь, используя linq и не заботясь о дубликатах

У меня есть список объектов Person. Я хочу преобразовать в словарь, где ключ - это имя и фамилия (объединенные), а значение - объект Person.

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

private Dictionary<string, Person> _people = new Dictionary<string, Person>();

_people = personList.ToDictionary(
    e => e.FirstandLastName,
    StringComparer.OrdinalIgnoreCase);

Я знаю, что это звучит странно, но мне пока безразличны дубликаты имен. Если есть несколько имен, я просто хочу получить одно. Могу ли я в любом случае написать этот код выше, чтобы он занимал одно из имен и не дублировал дубликаты?

145
задан BartoszKP 27 September 2013 в 14:55
поделиться

3 ответа

Вот очевидное, не Решение linq:

foreach(var person in personList)
{
  if(!myDictionary.Keys.Contains(person.FirstAndLastName))
    myDictionary.Add(person.FirstAndLastName, person);
}
66
ответ дан 23 November 2019 в 22:45
поделиться

Решение LINQ:

// Use the first value in group
var _people = personList
    .GroupBy(p => p.FirstandLastName, StringComparer.OrdinalIgnoreCase)
    .ToDictionary(g => g.Key, g => g.First(), StringComparer.OrdinalIgnoreCase);

// Use the last value in group
var _people = personList
    .GroupBy(p => p.FirstandLastName, StringComparer.OrdinalIgnoreCase)
    .ToDictionary(g => g.Key, g => g.Last(), StringComparer.OrdinalIgnoreCase);

Если вы предпочитаете решение, отличное от LINQ, вы можете сделать что-то вроде этого:

// Use the first value in list
var _people = new Dictionary<string, Person>(StringComparer.OrdinalIgnoreCase);
foreach (var p in personList)
{
    if (!_people.ContainsKey(p.FirstandLastName))
        _people[p.FirstandLastName] = p;
}

// Use the last value in list
var _people = new Dictionary<string, Person>(StringComparer.OrdinalIgnoreCase);
foreach (var p in personList)
{
    _people[p.FirstandLastName] = p;
}
391
ответ дан 23 November 2019 в 22:45
поделиться

Для удаления дубликатов реализуйте IEqualityComparer < Человек> , который можно использовать в методе Distinct () , и тогда получить ваш словарь будет легко. Дано:

class PersonComparer : IEqualityComparer<Person>
{
    public bool Equals(Person x, Person y)
    {
        return x.FirstAndLastName.Equals(y.FirstAndLastName, StringComparison.OrdinalIgnoreCase);
    }

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

class Person
{
    public string FirstAndLastName { get; set; }
}

Получите свой словарь:

List<Person> people = new List<Person>()
{
    new Person() { FirstAndLastName = "Bob Sanders" },
    new Person() { FirstAndLastName = "Bob Sanders" },
    new Person() { FirstAndLastName = "Jane Thomas" }
};

Dictionary<string, Person> dictionary =
    people.Distinct(new PersonComparer()).ToDictionary(p => p.FirstAndLastName, p => p);
7
ответ дан 23 November 2019 в 22:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: