Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

البحث باستخدام 'firstWhere'

جزء من قسم Logic & Flow في رحلة Dart على Coddy — الدرس 15 من 65.

عندما تحتاج إلى العثور على عنصر محدد في قائمة يستوفي معايير معينة، توفر طريقة firstWhere() حلاً فعالاً. وعلى عكس طرق التصفية التي تعيد جميع العناصر المطابقة، تتوقف firstWhere() عن البحث بمجرد العثور على أول عنصر يستوفي شرطك.

تأخذ الطريقة firstWhere() وظيفة اختبار تُرجع true أو false لكل عنصر. وهي تفحص العناصر واحداً تلو الآخر حتى تجد العنصر الأول الذي يجتاز الاختبار، ثم تعيد ذلك العنصر على الفور.

List<int> numbers = [1, 3, 8, 15, 22, 7];

// البحث عن أول رقم زوجي
int firstEven = numbers.firstWhere((number) => number % 2 == 0);
print(firstEven);  // 8

في الحالات التي لا يتطابق فيها أي عنصر مع شرطك، يوفر firstWhere() معلمة orElse اختيارية. تقبل هذه المعلمة دالة تُرجع قيمة افتراضية عند عدم العثور على تطابق، مما يمنع برنامجك من التعطل بسبب خطأ.

challenge icon

التحدي

سهل

قم بإنشاء برنامج يدير نظام خدمة العملاء من خلال العثور على أول شكوى عميل تتطلب اهتماماً فورياً. يجب على برنامجك القيام بما يلي:

  1. قراءة مدخل نصي (string) يمثل اسم القسم (department name)
  2. قراءة عدة مدخلات صحيحة (integers) تمثل مستويات أولوية الشكاوى (ينتهي الإدخال عندما تتلقى -1)
  3. قراءة مدخل صحيح (integer) يمثل حد الأولوية العاجلة (urgent priority threshold)
  4. استخدام التابع firstWhere() للعثور على أول شكوى بمستوى أولوية أكبر من أو يساوي الحد العاجل
  5. طباعة نتائج خدمة العملاء بالتنسيق الدقيق الموضح أدناه

على سبيل المثال، إذا كان اسم القسم هو "Technical Support"، ومستويات الأولوية هي 3، 7، 2، 9، 4، والحد العاجل هو 8، فيجب أن يخرج برنامجك ما يلي:

Department: Technical Support
All complaints: [3, 7, 2, 9, 4]
Urgent threshold: 8
Searching for first complaint >= 8
First urgent complaint: 9
Status: Urgent complaint found - immediate action required

إذا كان اسم القسم هو "Billing Department"، ومستويات الأولوية هي 4، 6، 3، 5، والحد العاجل هو 7، فيجب أن يخرج برنامجك ما يلي:

Department: Billing Department
All complaints: [4, 6, 3, 5]
Urgent threshold: 7
Searching for first complaint >= 7
First urgent complaint: Not found
Status: No urgent complaints - continue normal processing

إذا كان اسم القسم هو "Sales Support"، ومستويات الأولوية هي 10، 2، 8، والحد العاجل هو 9، فيجب أن يخرج برنامجك ما يلي:

Department: Sales Support
All complaints: [10, 2, 8]
Urgent threshold: 9
Searching for first complaint >= 9
First urgent complaint: 10
Status: Urgent complaint found - immediate action required

يجب أن يستخدم برنامجك التابع firstWhere() للعثور على أول أولوية شكوى أكبر من أو تساوي الحد العاجل. إذا لم يتم العثور على شكوى عاجلة، فاعرض "Not found" للشكوى العاجلة الأولى واعرض "No urgent complaints - continue normal processing" كحالة (status). إذا تم العثور على شكوى عاجلة، فاعرض مستوى الأولوية واعرض "Urgent complaint found - immediate action required" كحالة.

ورقة مرجعية

تبحث طريقة firstWhere() عن العنصر الأول في قائمة يستوفي شرطًا معينًا. وتتوقف عن البحث بمجرد العثور على تطابق وتعيد ذلك العنصر.

List<int> numbers = [1, 3, 8, 15, 22, 7];

// البحث عن أول رقم زوجي
int firstEven = numbers.firstWhere((number) => number % 2 == 0);
print(firstEven);  // 8

استخدم المعامل orElse لتوفير قيمة افتراضية عندما لا يتطابق أي عنصر مع الشرط:

// إرجاع قيمة افتراضية في حال عدم العثور على تطابق
int result = numbers.firstWhere(
  (number) => number > 100,
  orElse: () => -1
);

جرّب بنفسك

import 'dart:io';

void main() {
  // قراءة اسم القسم
  String? department = stdin.readLineSync();
  
  // قراءة مستويات أولوية الشكاوى حتى -1
  List<int> complaints = [];
  while (true) {
    int priority = int.parse(stdin.readLineSync()!);
    if (priority == -1) break;
    complaints.add(priority);
  }
  
  // قراءة حد الاستعجال
  int urgentThreshold = int.parse(stdin.readLineSync()!);
  
  // TODO: اكتب الكود الخاص بك أدناه
  // للعثور على أول شكوى >= urgentThreshold استخدم الدالة firstWhere()
  
  // طباعة النتائج
  print('Department: $department');
  print('All complaints: $complaints');
  print('Urgent threshold: $urgentThreshold');
  print('Searching for first complaint >= $urgentThreshold');
  // طباعة نتيجة أول شكوى عاجلة
  // طباعة رسالة الحالة
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Logic & Flow