2009-04-27 3 views
4

Laissez-moi commencer par dire que je l'ai lu ces questions: 1 & 2, et je comprends que je peux écrire le code pour trouver des doublons dans ma liste, mais mon problème est que je veux mettre à jour la liste d'origine non seulement interroger et imprimer les doublons.Comment trouver les doublons dans une liste <T> rapidement, et mettre à jour la collection originale

Je sais que je ne peux pas mettre à jour la collection renvoyée par la requête car ce n'est pas une vue, c'est un type anonyme IEnumerable<T>.

Je veux être en mesure de trouver des doublons dans ma liste, et marquer une propriété que j'ai créée appelée State qui est utilisée plus tard dans l'application.

Est-ce que quelqu'un a rencontré ce problème et pouvez-vous me diriger dans la bonne direction?

p.s. L'approche que j'utilise ATM est une boucle de type de tri à bulles pour parcourir la liste élément par élément et comparer les champs clés. Évidemment, ce n'est pas la méthode la plus rapide.

EDIT:

Afin d'examiner un élément dans la liste un « double », il y a trois domaines qui doivent correspondre. Nous les appellerons Field1, Field2 et Field3

J'ai une méthode Equals() surchargée sur la classe de base qui compare ces champs.

La seule fois où je saute un objet dans ma méthode MarkDuplicates(), c'est si l'état des objets est UNKNOWN ou ERROR, sinon, je le teste. Faites-moi savoir si vous avez besoin de plus de détails.

Merci encore!

+1

s'il vous plaît ne pas utiliser BubbleSort, ... jamais! –

Répondre

8

Je pense que le plus simple est de commencer par écrire une méthode d'extension qui FIND doublons dans une liste d'objets. Puisque vous êtes des objets, utilisez .Equals(), ils peuvent être comparés dans la plupart des collections courantes.

public static IEnumerable<T> FindDuplicates<T>(this IEnumerable<T> enumerable) { 
    var hashset = new HashSet<T>(); 
    foreach (var cur in enumerable) { 
    if (!hashset.Add(cur)) { 
     yield return cur; 
    } 
    } 
} 

Maintenant, il devrait être assez facile de mettre à jour votre collection pour les doublons. Par exemple

List<SomeType> list = GetTheList(); 
list 
    .FindDuplicates() 
    .ToList() 
    .ForEach(x => x.State = "DUPLICATE"); 

Si vous avez déjà une méthode extentsion PourChaque définie dans votre code, vous pouvez éviter le .ToList.

+0

@JaredPar: Merci beaucoup pour votre aide. – Chris

1

Vos objets possèdent une sorte de propriété d'état. Vous trouvez vraisemblablement des doublons basés sur une autre propriété ou un ensemble de propriétés. Pourquoi ne pas:

List<obj> keys = new List<object>(); 

foreach (MyObject obj in myList) 
{ 
    if (keys.Contains(obj.keyProperty)) 
     obj.state = "something indicating a duplicate here"; 
    else 
     keys.add(obj.keyProperty) 
} 
+0

Ceci, sauf que si vous avez beaucoup d'objets, vous devriez utiliser un HashSet pour les "clés" au lieu d'une liste. – mquander

1
IEnumerable<T> oldList; 
IEnumerable<T> list; 

foreach (var n in oldList.Intersect(list)) 
    n.State = "Duplicate"; 

Edit: je dois lrn2read. ce code est pour 2 listes. Ma faute.

Questions connexes