Как удалить дубликаты в списке дротиков? list.distinct()?

Как удалить дубликаты из списка, не обманывая себя набором? Есть что-то вроде list.distinct()? или 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

Изменить: спасибо для ответов.   Установить, кажется, быстрее!!!, но он теряет порядок элементов:/

Ответ 1

У меня есть библиотека с именем Reactive-Dart, которая содержит много составных операторов для завершающих и не заканчивающихся последовательностей. Для вашего сценария это будет выглядеть примерно так:

final newList = [];
Observable
   .fromList(['abc', 'abc', 'def'])
   .distinct()
   .observe((next) => newList.add(next), () => print(newList));

Уступая:

[abc, def]

Я должен добавить, что есть и другие библиотеки с похожими функциями. Проверьте на github, и я уверен, что вы найдете что-то подходящее.

Ответ 2

Используйте toSet и затем toList

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

[1, 4, 5, 6]

Ответ 3

Попробуйте использовать пакет запросов.

import 'package:queries/collections.dart';

void main() {
  List<String> list = ["a", "a", "b", "c", "b", "d"];
  var result = new Collection(list).distinct();
  print(result.toList());
}
[a, b, c, d]

Ответ 4

void uniqifyList(List<Dynamic> list) {
  for (int i = 0; i < list.length; i++) {
    Dynamic o = list[i];
    int index;
    // Remove duplicates
    do {
      index = list.indexOf(o, i+1);
      if (index != -1) {
        list.removeRange(index, 1);
      }
    } while (index != -1);
  }
}

void main() {
  List<String> list = ['abc', "abc", 'def'];
  print('$list');
  uniqifyList(list);
  print('$list');
}

Выдает вывод:

[abc, abc, def]
[abc, def]

Ответ 5

Set работает нормально, но не сохраняет порядок. Вот еще один способ использования LinkedHashSet:

import "dart:collection";

void main() {
  List<String> arr = ["a", "a", "b", "c", "b", "d"];
  var 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

Ответ 6

Если вы хотите сохранить порядок или имеете дело с более сложными объектами, чем примитивные типы. Сохраните просмотренные идентификаторы в наборе и отфильтруйте те, которые уже есть в наборе.

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

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

Ответ 7

Как насчет этого простого решения?

List<T> uniqifyList<T>(List<T> list) {
  var returnList = List<T>();
  for (var item in list) {
    if (!returnList.contains(item)) {
      returnList.add(item);
    }
  }
  return returnList;
}

Ответ 8

Вот оно рабочее решение:

var sampleList = ['1', '2', '3', '3', '4', '4'];
//print('orignal: $sampleList');
sampleList = Set.of(sampleList).toList();
//print('processed: $sampleList');

Выход:

orignal: [1, 2, 3, 3, 4, 4]
processed: [1, 2, 3, 4]

Ответ 9

Используя дротик 2. 3+, вы можете использовать операторы распространения, чтобы сделать это:

final ids = [1, 4, 4, 4, 5, 6, 6]; 
final distinctIds = [...{...ids}];

Будь это более или менее читабельно, чем ids.toSet().toList(), я позволю читателю решить :)