Laden...

[erledigt] Linq: Rückgabe einer Liste ohne Duplikate

Erstellt von tonka vor 14 Jahren Letzter Beitrag vor 14 Jahren 3.909 Views
tonka Themenstarter:in
373 Beiträge seit 2006
vor 14 Jahren
[erledigt] Linq: Rückgabe einer Liste ohne Duplikate

verwendetes Datenbanksystem: <LINQ 2 SQL>

Hy,

ich arbeite seit kurzem mit Linq und "konvertiere" ein altes Programm auf Linq schreibweise um. Funktioniert auch soweit sehr gut. Ich suche jetzt eine Funktion (wenns die in LINQ überhaupt gibt), bei der man von eine Spalte alle Einträge ohne Duplicate bekommt.

z.B. für Firmen (siehe Anhang)

Ich könnte zwar alle Daten in ein Array kopieren und dann mit foreach aussortieren, jedoch wäre mir ein Linq-Befehl(e) lieber.

Ist das mit Linq möglich?

MfG
Tonka

S
443 Beiträge seit 2008
vor 14 Jahren

Ich glaube Distinct ist da Deine Wahl
GroupBy gibts auch, habe ich aber noch nicht geschnallt wie man das verwendet

mbg
Rossegger Robert
mehr fragen mehr wissen

Montag morgen ist die beste Zeit um eine erfolgreiche Woche zu beginnen

1.433 Beiträge seit 2006
vor 14 Jahren

Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt

tonka Themenstarter:in
373 Beiträge seit 2006
vor 14 Jahren

Danke, werds mir ansehen!

tonka Themenstarter:in
373 Beiträge seit 2006
vor 14 Jahren

So, hab nun meinen Comparer Klasse gebaut, jedoch funkt das nicht so ganz. Mit google finde ich immer Beispiele, die aussehen wie meines.


public class CompanyComparer : IEqualityComparer<DbData>
        {
            #region IEqualityComparer<DbData> Member

            public bool Equals(DbData x, DbData y)
            {
                return x.Company.Equals(y.Company);
            }

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

            #endregion
        }

Aufruf des Comparer bei Distinct Funktion


var l = db.DbData.Distinct(new CompanyComparer ());
                if (l != null)
                {
                    foreach (DbData Line in l)
                    {
                        if (Line == null || Line.Company.Equals(""))
                        {
                            continue;
                        }
                        TreeViewItem item = new TreeViewItem();
                        item.Name = Line.Company;
                    }
                }

Bei der foreach bekomme ich dann die Exception, das die Überladung von IEqualityComparer nicht unterstützt wird.

Was mache ich bitte falsch???

MfG
Tonka

2.891 Beiträge seit 2004
vor 14 Jahren

Hallo Tonka,

warum benutzt du einen eigenen Comparer???
Sollte doch eigentlich folgendermaßen lösbar sein:
// EDIT: Falsches LINQ-Statement. Richtig siehe weiter unten.

Further reading: 101 Linq Samples - Distinct

Gruß,
dN!3L

tonka Themenstarter:in
373 Beiträge seit 2006
vor 14 Jahren

deswegen

Fehler 5 "lambda-Ausdruck" kann nicht in den Typ "System.Collections.Generic.IEqualityComparer<LSM.DataBase.DbData>" konvertiert werden, da dies kein Delegattyp ist.

2.891 Beiträge seit 2004
vor 14 Jahren

Edit: Oh, muss natürlich heißen:

List<string> companies = db.DbData.Select(d => d.Company).Distinct().ToList(); 

oder in "SQL-Notation":

List<string> companies = 
     (from d in db.DbData
      select d.Company)
     .Distinct()
     .ToList()

Gruß,
dN!3L

tonka Themenstarter:in
373 Beiträge seit 2006
vor 14 Jahren

Super. Jetzt funktionierts. Ich muss mich echt noch genauer mit den Lambda-Befehlen beschäftigen.

Viel viel Dank.

MfG
Tonka