166 votes

Comment supprimer les doublons dans une liste Dart ? list.distinct() ?

Comment supprimer les doublons d'une liste sans avoir recours à un jeu ? Existe-t-il quelque chose comme list.distinct() ? ou list.unique() ?

void main() {
  print("Hello, World!");

  List<String> list = ['abc',"abc",'def'];
  list.forEach((f) => print("this is list $f"));

  Set<String> set = new Set<String>.from(list);
  print("this is #0 ${list[0]}");
  set.forEach((f) => print("set: $f"));

  List<String> l2= new List<String>.from(set);
  l2.forEach((f) => print("This is new $f"));
}

Hello, World!
this is list abc
this is list abc
this is list def
this is #0 abc
set: abc
set: def
This is new abc
This is new def

Définir semble être plus rapide ! Mais il perd l'ordre des éléments :/

436voto

Twisted Inferno Points 462

Utilisez toSet et ensuite toList

  var ids = [1, 4, 4, 4, 5, 6, 6];
  var distinctIds = ids.toSet().toList();

Résultat : [1, 4, 5, 6]

Ou avec des opérateurs d'écartement :

var distinctIds = [...{...ids}];

159voto

Robert Hahn Points 1795

Je n'ai trouvé aucune des réponses fournies très utile. Voici ce que je fais généralement :

final ids = Set();
myList.retainWhere((x) => ids.add(x.id));

Bien entendu, vous pouvez utiliser n'importe quel attribut permettant d'identifier vos objets de manière unique. Il n'est pas nécessaire que ce soit un id champ.

Avantages par rapport à d'autres approches :

  • Préserve l'ordre original de la liste
  • Fonctionne pour les objets riches et pas seulement pour les primitives/types hachables
  • Il n'est pas nécessaire de copier la liste entière dans un ensemble et de la ramener dans une liste.

Mise à jour 09/12/21
Vous pouvez également déclarer une méthode d'extension une fois pour les listes :

extension Unique<E, Id> on List<E> {
  List<E> unique([Id Function(E element)? id, bool inplace = true]) {
    final ids = Set();
    var list = inplace ? this : List<E>.from(this);
    list.retainWhere((x) => ids.add(id != null ? id(x) : x as Id));
    return list;
  }
}

Cette méthode d'extension fait la même chose que ma réponse originale. Utilisation :

// Use a lambda to map an object to its unique identifier.
myRichObjectList.unique((x) => x.id);
// Don't use a lambda for primitive/hashable types.
hashableValueList.unique();

45voto

Steffan Points 1823

Set fonctionne bien, mais ne préserve pas l'ordre. Voici une autre façon d'utiliser LinkedHashSet :

import "dart:collection";

void main() {
  List<String> arr = ["a", "a", "b", "c", "b", "d"];
  List<String> result = LinkedHashSet<String>.from(arr).toList();
  print(result); // => ["a", "b", "c", "d"]
}

https://api.dart.dev/stable/2.4.0/dart-collection/LinkedHashSet/LinkedHashSet.from.html

33voto

Anandu YD Points 301

Essayez ce qui suit :

List<String> duplicates = ["a", "c", "a"];

duplicates = duplicates.toSet().toList();

Vérifiez ce code sur Dartpad .

22voto

Niko Ruotsalainen Points 10833

Si vous souhaitez conserver l'ordre ou si vous avez affaire à des objets plus complexes que les types primitifs, stockez les ids vus dans le fichier Définir et filtrer ceux qui sont déjà dans le jeu.

final list = ['a', 'a', 'b'];
final seen = Set<String>();
final unique = list.where((str) => seen.add(str)).toList();

print(unique); // => ['a', 'b']

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X