مراجعة - عمليات HashMap
جزء من قسم المنطق وتدفق التنفيذ في رحلة C# على Coddy. الدرس 55 من 66.
التحدي
متوسطأنشئ أسلوبًا يُسمى ProcessDictionary يُجري عمليات متقدمة على مخزون Dictionary<string, int>. يجب أن يقوم الأسلوب بما يلي:
- معالجة الأوامر من قائمة operations:
COUNT: اطبعTotal items: {count}(حيث إن{count}هو عدد المفاتيح المميزة)، ثم اطبع رسالة successADD item quantity: أضف item جديدًا بالكمية المحددة (إذا كان item موجودًا، فزد كميته)، ثم اطبع رسالة successREMOVE item: أزل item المحدد من المخزون، ثم اطبع رسالة success أو الفشلUPDATE item quantity: عيّن كمية item إلى القيمة المحددة، ثم اطبع رسالة success أو الفشلFIND item: إذا كان item found، فاطبع{item}: {quantity}ثم رسالة success؛ وإذا لم يكن found، فاطبعNot foundثم رسالة الفشل
- لكل operation، اطبع رسالة حالة بهذا التنسيق بالضبط:
Operation {command} performed successfullyOperation {command} failed: {reason}. حيث إن{reason}هوItem not foundعندما لا يكون item موجودًا في المخزون
- أعد قاموس المخزون المحدّث
على سبيل المثال، يجب أن تؤدي معالجة
FIND orange في مخزون يحتوي على orange: 3 إلى طباعة:orange: 3Operation FIND performed successfullyوعند معالجة
REMOVE shoes عندما لا يكون shoes موجودًا في المخزون، يجب طباعة:Operation REMOVE failed: Item not foundجرّب بنفسك
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
class Program
{
public static Dictionary<string, int> ProcessDictionary(Dictionary<string, int> inventory, List<string> operations)
{
// ضع كودك هنا
return inventory;
}
static void Main(string[] args)
{
Dictionary<string, int> inventory = new Dictionary<string, int>();
List<string> operations = new List<string>();
// اقرأ السطر الأول للتحقق مما إذا كان بتنسيق JSON للمخزون
string firstLine = Console.ReadLine();
// تحقق مما إذا كان الإدخال بتنسيق JSON للمخزون
if (firstLine != null && firstLine.StartsWith("{") && firstLine.EndsWith("}"))
{
try
{
// معالجة إدخال JSON للمخزون
string jsonContent = firstLine.Substring(1, firstLine.Length - 2);
// قسّم حسب الفواصل التي ليست داخل علامات الاقتباس
string pattern = @",(?=(?:[^""]*""[^""]*"")*[^""]*$)";
string[] entries = Regex.Split(jsonContent, pattern);
foreach (string entry in entries)
{
// استخرج المفتاح والقيمة باستخدام regex
Match match = Regex.Match(entry, @"""([^""]+)""\s*:\s*(\d+)");
if (match.Success)
{
string keyMatch = match.Groups[1].Value;
int valueMatch = int.Parse(match.Groups[2].Value);
inventory.Add(keyMatch, valueMatch);
}
}
// Read second line for operations
string secondLine = Console.ReadLine();
// Check if operations are in JSON array format
if (secondLine != null && secondLine.StartsWith("[") && secondLine.EndsWith("]"))
{
try
{
// Extract content between square brackets
string arrayContent = secondLine.Substring(1, secondLine.Length - 2);
// Use regex to match all quoted strings - this is more robust
MatchCollection matches = Regex.Matches(arrayContent, @"""([^""]*)""");
foreach (Match match in matches)
{
// Add the captured group (without quotes)
if (match.Groups.Count > 1)
{
operations.Add(match.Groups[1].Value);
}
}
}
catch (Exception ex)
{
Console.WriteLine($"Error parsing operations array: {ex.Message}");
return;
}
}
else
{
// Process operations in traditional format
int m = int.Parse(secondLine);
for (int i = 0; i < m; i++)
{
operations.Add(Console.ReadLine());
}
}
}
catch (Exception ex)
{
Console.WriteLine($"Error parsing JSON input: {ex.Message}");
return;
}
}
else
{
// Process traditional input format
int n = int.Parse(firstLine);
for (int i = 0; i < n; i++)
{
string[] parts = Console.ReadLine().Split(':');
inventory.Add(parts[0], int.Parse(parts[1]));
}
// Read operations
int m = int.Parse(Console.ReadLine());
for (int i = 0; i < m; i++)
{
operations.Add(Console.ReadLine());
}
}
Dictionary<string, int> result = ProcessDictionary(inventory, operations);
// Print updated inventory
Console.WriteLine("Final Inventory:");
foreach (var item in result)
{
Console.WriteLine($"{item.Key}: {item.Value}");
}
}
}جميع دروس المنطق وتدفق التنفيذ
1المصفوفات متعددة الأبعاد
أساسيات المصفوفات ثنائية الأبعادتعريف وتهيئة المصفوفات ثنائية الأبعادالوصول إلى عناصر المصفوفة ثنائية الأبعادالحلقات المتداخلة مع المصفوفات ثنائية الأبعادالمصفوفات المتعرجة (Jagged Arrays)عمليات المصفوفات الشائعةمراجعة - المصفوفات متعددة الأبعاد4تقنيات التحكم في التدفق
الإرجاع المبكرشروط الحمايةجمل القفز (goto)Break و Continueتسطيح الشروط المتداخلة7المعاملات المنطقية المتقدمة
التقييم المختصرالمعاملات المنطقية الشرطيةأولوية المعاملاتمراجعة - المعاملات المتقدمة2اتخاذ القرارات المتقدم
الشروط المتعددةالمنطق البولياني المعقدمقارنة بين If و Switchجمل Switch المتداخلةمراجعة - القرارات المتقدمة5معالجة الاستثناءات
أساسيات Try-Catchأنواع الاستثناءاتكتل Catch المتعددةالتعامل مع الملفاتكتلة FinallyUsing مقابل Try-Finallyاستثناءات مخصصةمراجعة - معالجة الأخطاء8نظام تحليل البيانات
إعداد جمع البياناتمنطق إدخال البيانات11HashSet الجزء الأول
ما هو الـ HashSet؟إضافة عنصرحذف عنصرالتحقق من وجود عنصرالفراغ والحجمملخص - HashSet3تحسينات الحلقات التكرارية
أداء الحلقات التكراريةالتكرار عبر البيانات المعقدةأنواع الحلقات التكراريةإعادة هيكلة الحلقات التكراريةملخص - الحلقات المحسنة6التعامل مع الـ Null
أساسيات الـ Null Referenceأنواع القيم القابلة للـ Nullأنماط التحقق من الـ Nullالبرمجة الدفاعيةملخص - أمان الـ Nullتدرّب بنفسك: مترجم C# عبر الإنترنت