33 Stimmen

Linq Distinct() by name zum Auffüllen einer Dropdown-Liste mit Name und Wert

Ich versuche, eine Dropdown-Liste mit Pharmaunternehmen wie Bayer, Medley usw. zu füllen. Ich erhalte diese Namen aus der Datenbank, und diese Namen werden in der Datenbank wiederholt, aber mit unterschiedlichen IDs.

Ich versuche, Linq Distinct() zu verwenden, aber ich möchte nicht den Gleichheitsvergleicher verwenden. Gibt es einen anderen Weg?

Meine Dropdown-Liste muss mit der ID und dem Namen des Unternehmens gefüllt werden.

Ich versuche etwas wie:

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

Dies zeigt wiederholte Unternehmen in ddl.

Danke!

0 Stimmen

Wenn ein Unternehmen mehrfach mit verschiedenen Kennungen erscheint und Sie möchten, dass es nur einmal erscheint, welche Kennung soll dann angezeigt werden? Die erste? Spielt das keine Rolle?

76voto

Daniel Brückner Punkte 57561

Der folgende Ausdruck wählt nur eindeutige Unternehmen aus und gibt das erste Vorkommen mit seiner ID zurück.

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

0 Stimmen

Hallo Daniel! Das war genau das, was ich gebraucht habe! Danke dafür! :-)

0 Stimmen

Wenn ich folgendes tue: dgvRecords.DataSource = (from g in dbContext.records select g).GroupBy(g => g.ID).Select(g => g.FirstOrDefault()); Ich erhalte: Message=Specified method is not supported. Quelle=MySql.Data.Entity

0 Stimmen

@AndreMiranda können Sie verwenden groupby y select am Ende Ihres Haupt-Linq-Selects, das ist sehr nützlich @Daniel Brückner, TNX

16voto

Amy B Punkte 104656
var distinctCompanies = Companies
  .GroupBy(c => c.CompanyName)
  .Select(g => g.First());

0 Stimmen

Entschuldigen Sie die Frage, aber woher kommt das 'g'?

1 Stimmen

@StarCub Companies ist ein IEnumerable<Company>. GroupBy akzeptiert das und gibt IEnumerable<IGrouping<string, Company>> zurück. Jedes Element in der Auswahl ist ein IGrouping<string, Company>. Ich habe einen anderen Namen verwendet, um den Unterschied im Typ deutlicher zu machen.

3voto

Robert Harvey Punkte 173098

Distinct arbeitet an der gesamten Auswahl. Wenn Sie c.codPartner in die Auswahl einbeziehen und es zwei verschiedene Werte von c.codPartner für denselben c.name gibt, dann werden Sie zwei Zeilen mit demselben c.name sehen.

2voto

wegrata Punkte 1486

Ich glaube nicht, dass Sie dies mit einer anonymen Klasse tun können, aber wenn Sie ein Datenobjekt wie

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

}

können Sie ein Comparer-Objekt erstellen wie

    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 Punkte 98228

Wenn Sie keinen IEqualityComparer-Parameter angeben, wird nur Object.ReferenceEquals verwendet, das den GetHashKey-Wert des Objekts betrachtet. Bei anonymen Typen sind sie eindeutig.

Die Lösung dieses Problems ist ein wenig knifflig, da man für einen anonymen Typ keinen IEqualityComparer schreiben kann. Also müssen Sie einen echten Typ für das Problem erstellen:

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

0 Stimmen

ReferenceEquals vergleicht keine Hashcodes, sondern Referenzen... es gibt nur true zurück, wenn die beiden Referenzen auf dieselbe Instanz zeigen

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X