Flutter 包含model的List去重

以学生信息为例(ds提供,记录一下)

如果你有一个包含多个学生信息的 List,并且想要根据学生的姓名(name)进行去重,有几种方法可以实现。以下是几种常见的解决方案:

方法1: 使用 Set 和 map

List<Student> uniqueStudents = students
    .toSet()  // 转换为Set自动去重
    .toList();

不过这种方法需要你在 Student 类中重写 ==hashCode 方法:

class Student {
  final String name;
  // 其他属性...

  @override
  bool operator ==(Object other) =>
      identical(this, other) ||
      other is Student && runtimeType == other.runtimeType && name == other.name;

  @override
  int get hashCode => name.hashCode;
}

方法2: 使用 package:collection 的 Equality

import 'package:collection/collection.dart';

List<Student> uniqueStudents = students
    .toSet()
    .toList();

方法3: 手动去重(推荐)

这是最灵活的方法,不需要修改 Student 类:

List<Student> removeDuplicates(List<Student> students) {
  List<Student> result = [];
  Set<String> names = Set();
  
  for (var student in students) {
    if (!names.contains(student.name)) {
      names.add(student.name);
      result.add(student);
    }
  }
  
  return result;
}

// 使用
List<Student> uniqueStudents = removeDuplicates(students);

方法4: 使用 fold 函数

List<Student> uniqueStudents = students.fold([], (list, student) {
  if (!list.any((s) => s.name == student.name)) {
    list.add(student);
  }
  return list;
});

方法5: 使用 LinkedHashMap (保留顺序)

List<Student> uniqueStudents = LinkedHashMap.fromIterable(
  students,
  key: (student) => student.name,
  value: (student) => student,
).values.toList();

选择哪种方法取决于你的具体需求:

  • 如果需要保持顺序,方法3或方法5更好
  • 如果Student类可以修改,方法1最简洁
  • 方法4代码简洁但性能稍差
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。