178 votes

Convertir une liste en dictionnaire en utilisant linq sans se soucier des doublons

J'ai une liste d'objets de la Personne. Je veux convertir un Dictionnaire dont les clés sont les nom et prénom (concaténés) et la valeur de l'objet Personne.

Le problème est que j'ai quelques dupliqué les gens, donc, ce souffle si j'utilise ce code:

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

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

Je sais ça sonne bizarre, mais je n'ai pas vraiment de soins sur les doublons de noms pour l'instant. S'il y a plusieurs noms, je veux juste saisir un. Est-il de toute façon je peux écrire le code ci-dessus de sorte qu'il faut juste l'un des noms, et de ne pas sauter sur les doublons?

450voto

LukeH Points 110965
 var _people = personList
    .GroupBy(p => p.FirstandLastName, StringComparer.OrdinalIgnoreCase)
    .ToDictionary(g => g.Key, g => g.First(), StringComparer.OrdinalIgnoreCase);
 

Si vous préférez une solution non-LINQ, vous pouvez procéder comme suit:

 var _people = new Dictionary<string, Person>(StringComparer.OrdinalIgnoreCase);
foreach (var p in personList)
{
    _people[p.FirstandLastName] = p;
}
 

79voto

Carra Points 6832

Voici la solution évidente, non linq:

 foreach(var person in personList)
{
  if(!myDictionary.Keys.Contains(person.FirstAndLastName))
    myDictionary.Add(person.FirstAndLastName, person);
}
 

45voto

Tillito Points 2625

Une solution Linq utilisant Distinct () et sans groupement est:

 var _people = personList
    .Select(item => new { Key = item.Key, FirstAndLastName = item.FirstAndLastName })
    .Distinct()
    .ToDictionary(item => item.Key, item => item.FirstFirstAndLastName, StringComparer.OrdinalIgnoreCase);
 

Je ne sais pas si c'est mieux que la solution de LukeH mais ça marche aussi.

30voto

Ankit Dass Points 101
Cela devrait fonctionner.

7voto

Anthony Pegram Points 58528

Pour gérer l'élimination des doublons, implémentez un IEqualityComparer<Person> qui peut être utilisé dans la méthode Distinct() , puis obtenir votre dictionnaire sera facile. Donné:

 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; }
}
 

Obtenez votre dictionnaire:

 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);
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X