Более эффективный способ извлечения строк из списка классов Dart

#dart

Вопрос:

Просто ищу более эффективный способ сделать это в Dart:

 List<String> tagStrings = List();
List<TagCategory> categories = List();
    source.forEach(
      (content) {
        if (content.tagCategories != null) {
          categories.addAll(content.tagCategories);
        }
      },
    );
    categories = categories.toSet().toList(); // remove duplicates
    categories.forEach(
      (element) {
        List<Tag> tags = element.tags;
        tags.forEach(
          (tag) {
            tagStrings.add(tag.label);
          },
        );
      },
    );
    tagStrings = tagStrings.toSet().toList();
 

У меня есть список Trail объектов со списком TagCategory объектов, которые сами имеют список Tag объектов со String свойством, называемым label .

Я пытаюсь удалить все эти теги для использования в фильтре, и мне нужно удалить дубликаты, следовательно, взломать, чтобы преобразовать их в a set , а затем обратно в список, который я могу отсортировать.

Каков наиболее эффективный способ сделать это?

Ответ №1:

Преобразование в набор, чтобы избежать дублирования, — это нормально.

Я бы написал это буквально: Попробуйте:

 var tags = [...{for (var tag in {for (var content in source) ...?content.tagCategories})
                  tag.label}];
 

Затем вы можете беспокоиться о том, действительно ли вам нужно удалять дубликаты в категориях тегов, если вы все равно удаляете дубликаты в ярлыках впоследствии.

Если бы производительность была единственной целью, то я бы, вероятно, сделал что-то более важное, например:

 var set = <String>{}
for (var content in source) {
  var categories = content.tagCategories;
  if (categories != null) {
    for (var category in categories) set.add(category.label);
  }
}
var tagStrings = set.toList();