dart 如何搜索具有不同值的列表

xxls0lw8  于 2023-03-05  发布在  其他
关注(0)|答案(2)|浏览(159)

我有下面的模型,其中包括主题名称和其他值。

class SubjectModel{
    String chapter;
    String lesson;
// more values
    }

我以列表List<SubjectModel> subjects的形式获取数据。为了接收依赖于chapterlesson的结果,我需要过滤(搜索)列表。我为此编写了一个函数。

List<SubjectModel> subjects;  // where i receive data
searchSubjects(){
List<SubjectModel> result; // for adding result
if(searchcontroller.text.isEmpty){          // this is a texteditingcontroller
result = subjects;
} else{
// I need to get results based on both chapter and lesson
results = ? 
 }
}

有时章节和课程可能同名,例如:-章节Addtion,课程addition

0aydgbwb

0aydgbwb1#

您可以使用Listwhere方法:
term是搜索词,在您的情况下将其替换为searchcontroller.text

final results =
    subjects.where((item) => item.chapter == term || item.lesson == term);

这是区分大小写的,用于完全匹配。如果需要区分大小写:

final results = subjects.where((item) =>
    item.chapter.toLowerCase() == term.toLowerCase() ||
    item.lesson.toLowerCase() == term.toLowerCase());

如果需要部分匹配(区分大小写):

final results = subjects.where((item) =>
    item.chapter.contains(term) ||
    item.lesson.contains(term));

如果需要部分匹配(不区分大小写):

final results = subjects.where((item) =>
    item.chapter.toLowerCase().contains(term.toLowerCase()) ||
    item.lesson.toLowerCase().contains(term.toLowerCase()));

也可以搜索以**开始的搜索项。只需将contains替换为startsWith

hvvq6cgz

hvvq6cgz2#

要基于chapter和lesson属性搜索SubjectModel对象列表,可以使用Iterable类的where方法。where方法返回一个新的可迭代对象,该对象仅包含满足指定条件的原始可迭代对象的元素。
以下是修改searchSubjects方法以执行搜索的方法:

searchSubjects(){
  List<SubjectModel> result; // for adding result
  if(searchcontroller.text.isEmpty){          
    result = subjects;
  } else{
    String searchTerm = searchcontroller.text.toLowerCase();
    result = subjects.where((subject) => 
        subject.chapter.toLowerCase().contains(searchTerm) ||
        subject.lesson.toLowerCase().contains(searchTerm)
    ).toList();
  }
  // Do something with the search results
}

在本例中,searchTerm是在searchcontroller中输入的文本。where方法过滤主题列表,使其仅包含chapter或lessons属性包含搜索词(忽略大小写)的对象。对生成的可迭代对象调用toList方法,将其转换回列表。
请注意,搜索不区分大小写,这意味着无论搜索项是大写还是小写,搜索都将匹配。如果要执行区分大小写的搜索,请在where方法中删除对**toLowerCase()**的调用。

相关问题