استخدام '.toList()'
جزء من قسم Logic & Flow في رحلة Dart على Coddy — الدرس 12 من 65.
عندما تستخدم أساليب مثل map() و where() على قائمة، فإنها لا تُرجع List جديدة - بل تُرجع Iterable. وبينما يحتوي الـ Iterable على البيانات المحولة أو المصفاة التي تريدها، فإنك غالباً ما تحتاج إلى تحويله مرة أخرى إلى List لاستخدام أساليب وخصائص القائمة المألوفة.
تقوم الطريقة .toList() بتحويل Iterable مرة أخرى إلى List. تنشئ عملية التحويل هذه قائمة جديدة تحتوي على جميع العناصر من الـ iterable، مما يمنحك الوصول إلى جميع عمليات القائمة القياسية التي اعتدت عليها.
List<String> words = ['apple', 'banana', 'cherry', 'date'];
// تعيد ()where كائن Iterable، وليس List
var longWordsIterable = words.where((word) => word.length > 5);
// تحويل الـ Iterable إلى List
List<String> longWordsList = longWordsIterable.toList();
print(longWordsList); // ['banana', 'cherry']هذه الخطوة من التحويل ضرورية عندما تحتاج إلى إجراء عمليات قائمة إضافية على بياناتك المصفاة أو المحولة. بدون .toList()، ستعمل مع Iterable، الذي يمتلك وظائف محدودة أكثر من الـ List الكاملة.
التحدي
سهلقم بإنشاء برنامج يدير نظام توصية بكتب المكتبة من خلال تصفية الكتب بناءً على تفضيلات النوع وتحويل النتائج إلى تنسيق قائمة مناسب. يجب على برنامجك القيام بما يلي:
- قراءة مدخل نصي (string) يمثل اسم المكتبة
- قراءة مدخلات نصية متعددة تمثل عناوين الكتب (سينتهي الإدخال عندما تتلقى سلسلة فارغة)
- قراءة مدخلات نصية متعددة تمثل أنواع الكتب المقابلة لكل عنوان (سينتهي الإدخال عندما تتلقى سلسلة فارغة)
- قراءة مدخل نصي يمثل النوع المفضل للتصفية بناءً عليه
- استخدام التابع
where()لتصفية الكتب التي تطابق النوع المفضل - استخدام التابع
toList()لتحويل العناصر القابلة للتكرار (iterable) المصفاة إلى قائمة مناسبة - طباعة نتائج التوصية بالتنسيق الدقيق الموضح أدناه
على سبيل المثال، إذا كان اسم المكتبة هو "City Library"، والكتب هي "The Great Gatsby"، "Dune"، "Pride and Prejudice"، "1984"، والأنواع هي "Fiction"، "Science Fiction"، "Romance"، "Fiction"، والنوع المفضل هو "Fiction"، فيجب أن يخرج برنامجك ما يلي:
Library: City Library
All books: [The Great Gatsby, Dune, Pride and Prejudice, 1984]
All genres: [Fiction, Science Fiction, Romance, Fiction]
Filtering by genre: Fiction
Filtered books (iterable): (The Great Gatsby, 1984)
Recommended books (list): [The Great Gatsby, 1984]
Total recommendations: 2
Status: Recommendations readyإذا كان اسم المكتبة هو "School Library"، والكتب هي "Harry Potter"، "Lord of the Rings"، والأنواع هي "Fantasy"، "Fantasy"، والنوع المفضل هو "Mystery"، فيجب أن يخرج برنامجك ما يلي:
Library: School Library
All books: [Harry Potter, Lord of the Rings]
All genres: [Fantasy, Fantasy]
Filtering by genre: Mystery
Filtered books (iterable): ()
Recommended books (list): []
Total recommendations: 0
Status: Recommendations readyإذا كان اسم المكتبة هو "Community Library"، والكتب هي "To Kill a Mockingbird"، والأنواع هي "Classic"، والنوع المفضل هو "Classic"، فيجب أن يخرج برنامجك ما يلي:
Library: Community Library
All books: [To Kill a Mockingbird]
All genres: [Classic]
Filtering by genre: Classic
Filtered books (iterable): (To Kill a Mockingbird)
Recommended books (list): [To Kill a Mockingbird]
Total recommendations: 1
Status: Recommendations readyيجب أن يستخدم برنامجك التابع where() لتصفية الكتب من خلال مطابقة نوعها مع النوع المفضل، ثم استخدام التابع toList() لتحويل العناصر القابلة للتكرار الناتجة إلى قائمة. يجب عرض العناصر القابلة للتكرار المصفاة بتنسيق الأقواس الهلالية، بينما يجب عرض القائمة النهائية بتنسيق الأقواس المربعة.
ورقة مرجعية
تُرجع الدوال مثل map() و where() كائناً من نوع Iterable، وليس List. استخدم .toList() لتحويل الـ Iterable مرة أخرى إلى List:
List<String> words = ['apple', 'banana', 'cherry', 'date'];
// تُرجع ()where كائناً من نوع Iterable، وليس List
var longWordsIterable = words.where((word) => word.length > 5);
// تحويل الـ Iterable إلى List
List<String> longWordsList = longWordsIterable.toList();
print(longWordsList); // ['banana', 'cherry']هذا التحويل ضروري عندما تحتاج إلى إجراء عمليات قائمة إضافية على البيانات المصفاة أو المحولة.
جرّب بنفسك
import 'dart:io';
void main() {
// قراءة اسم المكتبة
String? libraryName = stdin.readLineSync();
// قراءة عناوين الكتب حتى يتم إدخال سلسلة فارغة
List<String> books = [];
while (true) {
String? book = stdin.readLineSync();
if (book == null || book.isEmpty) break;
books.add(book);
}
// قراءة أنواع الكتب حتى يتم إدخال سلسلة فارغة
List<String> genres = [];
while (true) {
String? genre = stdin.readLineSync();
if (genre == null || genre.isEmpty) break;
genres.add(genre);
}
// قراءة النوع المفضل
String? preferredGenre = stdin.readLineSync();
// TODO: اكتب الكود الخاص بك أدناه
// لتصفية الكتب حسب النوع المفضل where() استخدم دالة
// لتحويل العناصر المصفاة إلى قائمة toList() استخدم دالة
// طباعة النتائج بالتنسيق المطلوب
print('Library: $libraryName');
print('All books: $books');
print('All genres: $genres');
print('Filtering by genre: $preferredGenre');
// (list) والكتب الموصى بها (iterable) طباعة الكتب المصفاة
// طباعة إجمالي التوصيات والحالة
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1التعامل المتقدم مع القوائم
خصائص القائمة: first و lastحالة القائمة: isEmpty و isNotEmptyعكس القائمةالإضافة إلى القائمة: insertالحذف من القائمة: removeWhereالبحث في القائمة: indexOfفرز القائمةخلط القائمةملخص - منظم القوائم4معالجة الـ Map المتقدمة
التكرار عبر الـ Mapالتحقق من المفاتيح والقيمخصائص الـ Map: keys و valuesإضافة مشروطة: putIfAbsentإزالة العناصر من الـ Mapالـ Maps المتداخلةمراجعة - تحديث المخزون2عمليات القوائم الوظيفية
التحويل باستخدام 'map'التصفية باستخدام 'where'استخدام '.toList()'التحقق من الشروط باستخدام 'any'الشروط باستخدام 'every'البحث باستخدام 'firstWhere'مراجعة - تصفية البيانات5مشروع: حاسبة عربة التسوق
إعداد المشروعإضافة العناصر إلى العربة3المجموعات
ما هي المجموعة؟إنشاء مجموعةالإضافة والحذف من المجموعاتالتحقق من وجود عناصر في المجموعةتحويل قائمة إلى مجموعةاتحاد المجموعاتتقاطع المجموعاتالفرق بين المجموعاتمراجعة - قائمة ضيوف فريدة