以学生信息为例(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代码简洁但性能稍差