33 votes

Linq Distinct() by name pour remplir une liste déroulante avec un nom et une valeur

J'essaie de remplir une liste déroulante avec des sociétés pharmaceutiques, comme Bayer, Medley, etc. J'obtiens ces noms de la base de données et ces noms sont répétés dans la base de données, mais avec des identifiants différents.

J'essaie d'utiliser Linq Distinct(), mais je ne veux pas utiliser le comparateur d'égalité. Existe-t-il un autre moyen ?

Ma liste déroulante doit être remplie avec l'identifiant et le nom de l'entreprise.

J'essaie quelque chose comme :

var x = _partnerService
           .SelectPartners()
           .Select(c => new {codPartner = c.codPartner, name = c.name})
           .Distinct();

Cela montre des entreprises répétées dans ddl.

merci !

76voto

Daniel Brückner Points 36242

L'expression suivante ne sélectionnera que les entreprises distinctes et renverra la première occurrence avec son identifiant.

partnerService.SelectPartners().GroupBy(p => p.Name).Select(g => g.First());

16voto

David B Points 53123
var distinctCompanies = Companies
  .GroupBy(c => c.CompanyName)
  .Select(g => g.First());

3voto

Robert Harvey Points 103562

Des travaux distincts sur l'ensemble de la sélection. Si vous incluez c.codPartner dans la sélection et qu'il y a deux valeurs différentes de c.codPartner pour le même c.name, vous verrez deux lignes avec le même c.name.

2voto

wegrata Points 542

Je ne pense pas que vous puissiez faire cela avec une classe anonyme, mais si vous créez un objet de données comme

    class Foo
{
    private int _ID;

    public int ID
    {
        get { return _ID; }
        set { _ID = value; }
    }
    private string _Name;

    public string Name
    {
        get { return _Name; }
        set { _Name = value; }
    }

}

vous pouvez créer un objet comparateur comme

    class FooComparer : IEqualityComparer<Foo>
{

    public bool Equals(Foo x, Foo y)
    {
        return x.Name == y.Name;
    }

    public int GetHashCode(Foo obj)
    {
        return obj.GetHashCode();
    }

}

1voto

James Curran Points 55356

Si vous ne spécifiez pas de paramètre IEqualityComparer, il utilisera simplement Object.ReferenceEquals, qui examine la valeur GetHashKey de l'objet. Pour les types anonymes, ils sont uniques.

La résolution de ce problème est un peu délicate, car il n'est pas possible d'écrire un IEqualityComparer pour un type anonyme. Il faut donc créer un vrai type pour le problème :

class Partner
{
    public int codPartner {get; set;}
    public string name {get; set;}
    public override int GetHashCode() { return name .GetHashCode();}
}

var x = _partnerService.SelectPartners()
        .Select(c => new Partner {codPartner = c.codPartner, name = c.name})
        .Distinct();

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