myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Basistechnologien und allgemeine .NET-Klassen » Wie finde ich Duplikate in einer Objekt-Liste anhand von mehreren, aber nicht allen, Properties?
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Wie finde ich Duplikate in einer Objekt-Liste anhand von mehreren, aber nicht allen, Properties?

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
ill_son ill_son ist männlich
myCSharp.de-Mitglied

Dabei seit: 03.09.2009
Beiträge: 180
Entwicklungsumgebung: Visual Studio 2019
Herkunft: Leipzig


ill_son ist offline

Wie finde ich Duplikate in einer Objekt-Liste anhand von mehreren, aber nicht allen, Properties?

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

ich habe eine IEnumerable mit Objekten:

C#-Code:
public class MyObject
{
    public int Prop1 { get; }
    public string Prop2 { get; }
    public int Prop3 { get; }
}

...
//schnipp schnapp
...

IEnumerable<MyObject> MyEnumerable;

Jetzt möchte ich alle Duplikate finden, wobei Einträge als Duplikat gelten, wenn Prop1 und Prop2 gleich sind, Prop3 ist für den Vergleich uninteressant.

Nun liefert mir

C#-Code:
var dublicates = list.GroupBy(e => new { e.Prop1, e.Prop2 }).Where(g => g.Count() > 1).Select(g => g.Key);

ein IEnumerabel mit dem anonymen Typen {Prop1, Prop2}, ich benötige aber eine Auflistung mit den ganzen Objekten. Wie kann ich das anstellen?

Grüße, Alex
11.09.2020 11:32 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
T-Virus T-Virus ist männlich
myCSharp.de-Mitglied

Dabei seit: 17.04.2008
Beiträge: 1.598
Entwicklungsumgebung: Visual Studio, Codeblocks, Edi
Herkunft: Nordhausen, Nörten-Hardenberg


T-Virus ist offline Füge T-Virus Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Warum machst du ein GroupBy mit einem neuen Typen?
Mach doch GroupBy und dann ThenBy, dann bleibt dein Typ auch erhalten.
Danach sollte deine Daten passen.

T-Virus
11.09.2020 11:46 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
ill_son ill_son ist männlich
myCSharp.de-Mitglied

Dabei seit: 03.09.2009
Beiträge: 180
Entwicklungsumgebung: Visual Studio 2019
Herkunft: Leipzig

Themenstarter Thema begonnen von ill_son

ill_son ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo T-Virus,

Danke für deine Antwort. Ich muss gestehen, dass das Propblem meine aktuellen Linq-Kenntnisse etwas übersteigt. Wie müsste denn dann der Parameter für GroupBy aussehen?
11.09.2020 11:52 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
T-Virus T-Virus ist männlich
myCSharp.de-Mitglied

Dabei seit: 17.04.2008
Beiträge: 1.598
Entwicklungsumgebung: Visual Studio, Codeblocks, Edi
Herkunft: Nordhausen, Nörten-Hardenberg


T-Virus ist offline Füge T-Virus Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Schau in die Doku, der Aufbau ist nicht anders als bei Where.

 GroupBy
 ThenBy

T-Virus
11.09.2020 11:57 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
witte
myCSharp.de-Mitglied

Dabei seit: 03.09.2010
Beiträge: 910


witte ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

GroupBy ist overkill für Duplikate. Du kannst doch einfach Distinct() verwenden. Schau mal ob er es berücksichtigt wenn du Equals überschreibst oder IEquatable<T> implementierst. Sicherlich gibt es auch irgendwo ne Lib welche Linq um DistinctBy erweitert.
11.09.2020 12:14 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
T-Virus T-Virus ist männlich
myCSharp.de-Mitglied

Dabei seit: 17.04.2008
Beiträge: 1.598
Entwicklungsumgebung: Visual Studio, Codeblocks, Edi
Herkunft: Nordhausen, Nörten-Hardenberg


T-Virus ist offline Füge T-Virus Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

@witte
Wie soll Distinct dabei helfen die Dublikatte zu ermitteln?
Dadurch werden diese entfernt, was aber nicht der Sinn der Umsetzung ist.
Der TE will ja explizit nur die Einträge, die anhand der Properties mehr als einmal vorhanden sind.

T-Virus
11.09.2020 12:25 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 14.201
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Also davon abgesehen, dass dieses Thema quasi Linq-Alltag ist und sicherlich über Google hunderte Treffer sich finden lassen, seh ich das auch so, dass ein GroupBy (in der Laufzeit) völliger Overkill ist.

Über ein GroupBy könnte man anhand der Properties einfach den GroupKey setzen; ein ThenBy ist gar nicht notwendig.

C#-Code:
var duplicates = mySource
    .GroupBy(e => new { e.Prop1, e.Prop2 })
    .Where(g => g.Count() > 1)
    .SelectMany(e => e)
    .ToList();

Aber eigentlich sauberer dürfte das ganze einfach über nen IEqualityComparer gehen.
Der IEqualityComparer beachtet dabei nur die gewünschten Properties und über nen HashSet-Compare lassen sich duplikate sehr schnell (viel schneller als GroupBy) und übersichtlich finden.
Gerade wenn man Linq nicht verstanden hat, dann bringt es ja nichts, wenn man damit arbeitet und es nicht versteht.

Ich hab da aus den Tiefen meiner Snippets auch noch was

C#-Code:
  public static IEnumerable<TSource> FindDuplicates<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> selector, IEqualityComparer<TKey> comparer)
  {
    var set = new HashSet<TKey>(comparer);
    return source.Where(item => !set.Add(selector(item)));
  }

Man kann aber auch einfach  Except verwenden und den Comparer verwenden - gleiches Prinzip.
11.09.2020 12:53 Beiträge des Benutzers | zu Buddylist hinzufügen
witte
myCSharp.de-Mitglied

Dabei seit: 03.09.2010
Beiträge: 910


witte ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

@T-Virus
Hmh, mir ist eigentlich gar nicht klar was der TE überhaupt damit will. Meistens ja um diese zu entfernen. Daher meine Antwort.
11.09.2020 13:08 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
T-Virus T-Virus ist männlich
myCSharp.de-Mitglied

Dabei seit: 17.04.2008
Beiträge: 1.598
Entwicklungsumgebung: Visual Studio, Codeblocks, Edi
Herkunft: Nordhausen, Nörten-Hardenberg


T-Virus ist offline Füge T-Virus Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

@Abt
Ist natürlich ein besserer Ansatz :)

@witte
Hängt halt vom Kontext ab.
Kann auch sein, dass er eine Liste aus einer Datei einliest und Dubletten suchen und anzeigen muss.
Dann macht es schon Sinn, diese einfach zu ermitteln und dann nur noch anzuzeigen.
Aus diesem Kontext habe ich es betrachtet und bin auch erst einmal davon ausgegangen, da der TE ja explizit nach den Dublikaten suchte.
Zum reinen entfernen wäre dann natürlich Distinct sinnvoller. ;)

T-Virus
11.09.2020 14:43 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
ill_son ill_son ist männlich
myCSharp.de-Mitglied

Dabei seit: 03.09.2009
Beiträge: 180
Entwicklungsumgebung: Visual Studio 2019
Herkunft: Leipzig

Themenstarter Thema begonnen von ill_son

ill_son ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von witte:
@T-Virus
Hmh, mir ist eigentlich gar nicht klar was der TE überhaupt damit will. Meistens ja um diese zu entfernen. Daher meine Antwort.

Ich möchte die Einträge erstmal markieren, um sie in der Anzeige hervorzuheben.

@all: Danke für die Hilfe.

Grüße, Alex
11.09.2020 15:00 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 26.09.2020 07:25