2010-04-16 5 views
2

J'essaie de supprimer les doublons dans ma liste.Suppression des doublons dans Delphi listview

Cette fonction:

procedure RemoveDuplicates(const LV:TbsSkinListView); 
var 
    i,j: Integer; 
begin 
    LV.Items.BeginUpdate; 
    LV.SortType := stText; 
    try 
    for i := 0 to LV.Items.Count-1 do 
    begin 
     for j:=i+1 to LV.Items.Count-1 do 
     begin 
     if SameText(LV.Items[i].SubItems[0], LV.Items[j].SubItems[0]) and 
     SameText(LV.Items[i].SubItems[1], LV.Items[j].SubItems[1]) and 
     SameText(LV.Items[i].SubItems[2], LV.Items[j].SubItems[2]) and 
     SameText(LV.Items[i].SubItems[3], LV.Items[j].SubItems[3]) then  
     LV.Items.Delete(j); 
     end; 
    end; 
    finally 
    LV.SortType := stNone; 
    LV.Items.EndUpdate; 
    end; 
    ShowMessage('Deleted');  
end; 

ne supprime pas les doublons. Qu'est-ce qui va pas avec ça?

+0

Que fait-il que vous ne voulez pas faire? – Nat

+0

je veux dire son ne supprime pas dublicates monsieur – radick

Répondre

4

à une supposition, puisque vous ne l'avez pas mentionné ce qui va mal, je pense qu'il a procédé à voir avec le fait que i et j ne sont pas valides après avoir supprimé un élément parce que vous comptez UP.

Une meilleure idée serait de compter vers le bas à la place:

procedure RemoveDuplicates(const LV:TbsSkinListView); 
var 
    i,j: Integer; 
begin 
    LV.Items.BeginUpdate; 
    LV.SortType := stText; 
    try 
    for i := LV.Items.Count-1 downto 0 do // <- this loop now counts _down_ 
    begin 
     for j:= LV.Items.Count-1 downto i+1 do // <- this loop now counts _down_ 
     begin 
     if SameText(LV.Items[i].SubItems[0], LV.Items[j].SubItems[0]) and 
      SameText(LV.Items[i].SubItems[1], LV.Items[j].SubItems[1]) and 
      SameText(LV.Items[i].SubItems[2], LV.Items[j].SubItems[2]) and 
      SameText(LV.Items[i].SubItems[3], LV.Items[j].SubItems[3]) then  
      LV.Items.Delete(j); 
     end; 
    end; 
    finally 
    LV.SortType := stNone; 
    LV.Items.EndUpdate; 
    end; 
    ShowMessage('Deleted');  
end; 
+0

merci cela a fonctionné :), je me suis trompé en venant de haut en bas merci encore :) – radick

2

La meilleure façon de le faire dans Delphi l'OMI est de le faire comme ça ....

  • Créer une fonction qui crée une hashkey pour votre critera correspondant -à-dire ajouter le texte que vous voulez correspondent ensemble, puis hachez-le.
  • utiliser le hachage comme une clé dans une liste
  • Dirigez votre listview et enlever tout élément qui est pas dans la liste.

Pseudo Code .... (non testé)

var 
    hash : integer; 
    i : integer; 
    list : SomeGenericList; // some generic list to contain your hash. 
Begin 
    list = SomeGenericList.Create; 
    for i := pred(lv.Items.Count) downto 0 
    begin 
     hash := GetHashValue(lv.items[i]); 
     if List.Contains(hash) 
     begin 
      lv.Items.Delete(i); 
     end else 
     begin 
      List.Add(hash); 
     end; 
    end; 
    list.free; 
end; 

Honte delphi ne possède pas de fonctionnalité de type Linq, ce serait une tâche très simple en utilisant cela.

Questions connexes