Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

List<String> Doppelte Werte finden und löschen per LINQ

2,076 views
Skip to first unread message

Pawel Warmuth

unread,
Jan 21, 2010, 6:02:48 AM1/21/10
to
Hallo NG,

LINQ will grad nicht so wie ich will.

ich habe eine List<String> mit evtl. doppelten Werten.
Diese will ich per LINQ filtern kriege es aber nicht hin.

Jmd nen Codeschnipsel f�r den Fall ?

Danke und Gru�

Roman Wagner

unread,
Jan 21, 2010, 6:56:05 AM1/21/10
to
static void Main(string[] args)
{
foreach (string s in "aabbccddeeaabbccddeeabcdeeabcd".ToCharArray
().
Select(x => new String(x, 1)).
Distinct())
Console.Write(s);
Console.Read();
}


Martin Hey

unread,
Jan 21, 2010, 6:54:44 AM1/21/10
to
List<string> allItems = new List<string> { "a", "b", "c", "d", "e", "f",
"a", "e", "e" };
var distinctItems = allItems.Distinct();

var duplicates = (from item in allItems
group item by item into g
from groupItem in g
where g.Count() > 1
select g.Key).Distinct();


Die erste Funktion liefert jeden Eintrag nur einmal zur�ck und die zweite
ermittelt, welche Eintr�ge mehrfach vorkommen.

"Pawel Warmuth" <sp...@root.de> schrieb im Newsbeitrag
news:eW3NGlom...@TK2MSFTNGP06.phx.gbl...

Pawel Warmuth

unread,
Jan 21, 2010, 9:01:18 AM1/21/10
to
Hallo,

Danke zusammen :-)

Gr��e


"Pawel Warmuth" <sp...@root.de> schrieb im Newsbeitrag
news:eW3NGlom...@TK2MSFTNGP06.phx.gbl...

Markus Springweiler

unread,
Jan 21, 2010, 11:50:39 AM1/21/10
to
Hallo Martin,

> var duplicates = (from item in allItems
> group item by item into g

> !!! from groupItem in g ???


> where g.Count() > 1
> select g.Key).Distinct();

Die mittlere Zeile wirkt sich aber nicht gerade positiv auf die
Geschwindigkeit aus, und scheint mir total unn�tz -- �bersehe ich etwas
essentielles dabei?

--
/\/\arkus.

Markus Springweiler

unread,
Jan 21, 2010, 11:53:17 AM1/21/10
to
Nachtrag,

Das abschlie�ende Distinct() ist ohne "from groupItem in g" nat�rlich auch
unn�tig.

--
/\/\arkus.

Martin Hey

unread,
Jan 22, 2010, 1:28:56 AM1/22/10
to
Ohne Gruppierung kannst du nicht ermitteln, welche Datens�tze doppelt sind.
Das Distinct am Ende ist dann unn�tz, wenn du in der weiteren Programmlogik
mit mehreren gleichen Datens�tzen umgehen kannst - f�r mich hatte es den
Charme, einfach nur zu wissen, dass es im Beispiel 2 Auspr�gungen gibt, die
mehrfach vorkommen.

Genau in diese Kerbe schl�gt auch das Thema Performance: �ber wie viele
Eintr�ge in der generischen Liste und �ber wie viele Ausf�hrungen der Query
reden wir denn? Wenn dein Code hinterher noch mehrfach gefundene Duplikate
per Loop zusammenf�hren muss, musst du diese Zeit ja in die Betrachtung mit
einflie�en lassen.

Wir k�nnen die Query gern noch etwas performanceoptimieren und genau auf
deinen Anwendungsfall ausrichten, aber dann m�sstest du noch ein paar mehr
Informationen preisgeben als "LINQ-Query zum Auffinden von Duplikaten in
List<string> gesucht". Denn eines unterschreibe ich blind. LINQ ist ein
m�chtiges Tool, aber sollte angewandt werden, wenn es sinnvoll ist und
i.d.R. auch nur f�r den speziellen Anwendungsfall.


"Markus Springweiler" <spr...@gmx.de> schrieb im Newsbeitrag
news:1tjccvdj...@sihv.de...

Martin Hey

unread,
Jan 22, 2010, 1:36:35 AM1/22/10
to
Nachtrag....

Es ging dir ja eher um die Projektion als um die Gruppierung. Und die ist
hier wirklich unn�tz.
In dem Punkt nehme ich meine Aussage von eben zur�ck und bgehaupte das
Gegenteil ;)

also:


var duplicates = (from item in allItems
group item by item into g

where g.Count() > 1
select g.Key).Distinct();

wenn die duplicates jedes doppelte Element nur einmal enthalten soll
und ohne Distinct, wenn es egal ist, wie h�ufig diese dort enthalten sind.

"Markus Springweiler" <spr...@gmx.de> schrieb im Newsbeitrag
news:1tjccvdj...@sihv.de...

Markus Springweiler

unread,
Jan 22, 2010, 3:52:21 AM1/22/10
to
Hallo Martin,

ich bin �brigens nicht der Threader�ffner.

> In dem Punkt nehme ich meine Aussage von eben zur�ck und bgehaupte das
> Gegenteil ;)

;-)

> also:
> var duplicates = (from item in allItems
> group item by item into g
> where g.Count() > 1
> select g.Key).Distinct();
> wenn die duplicates jedes doppelte Element nur einmal enthalten soll
> und ohne Distinct, wenn es egal ist, wie h�ufig diese dort enthalten sind.

Naja: Jetzt musst du mir nur noch die Beispieldaten zeigen, bei welchen
nach dem GroupBy noch mehrfache Werte f�r den Key zur�ckgegeben werden,
welche Distinct() eliminieren soll.
Das "Problem" der mehrfach vorkommenden Werte entstand ja nur durch die
Projektion (SelectMany()).

--
/\/\arkus.

Martin Hey

unread,
Jan 22, 2010, 11:54:48 AM1/22/10
to
Hab ich auch gemerkt.... ;)

"Markus Springweiler" <spr...@gmx.de> schrieb im Newsbeitrag

news:3oyi0f0qpizj$.dlg@sihv.de...

0 new messages