Linq Zip Method in C#

شرح دالة Zip() في LINQ

دالة Zip() في LINQ تُستخدم لدمج عنصرين من تسلسلين مختلفين في عنصر واحد، وذلك بدمج العناصر التي لها نفس الفهرس في كل تسلسل. إذا اختلف الطول بين التسلسلين، فإن النتيجة ستكون بطول أقصر تسلسل.


الصيغة العامة:


IEnumerable<TResult> result = firstSequence.Zip(secondSequence, (first, second) =>
{
    // دمج العناصر هنا
});
  • firstSequence: التسلسل الأول من النوع IEnumerable<TFirst>.
  • secondSequence: التسلسل الثاني من النوع IEnumerable<TSecond>.
  • resultSelector: دالة تحدد كيفية دمج العناصر.


مثال عملي:


int[] numbers = { 1, 2, 3, 4 };
string[] words = { "one", "two", "three" };

var numbersAndWords = numbers.Zip(words, (number, word) => number + " " + word);

foreach (var item in numbersAndWords)
{
    Console.WriteLine(item);
}


الناتج:


1 one
2 two
3 three

في هذا المثال، تم دمج عناصر numbers مع words بنفس ترتيب الفهرس. ولأن words بها 3 عناصر فقط، فإن الناتج يحتوي على 3 عناصر فقط.


ملاحظات هامة:

  • التنفيذ المؤجل: Zip() لا تُنفذ حتى يتم اجتياز النتيجة باستخدام foreach أو تحويلها إلى قائمة.
  • تسلسلات مختلفة الطول: يتم تجاهل العناصر الزائدة في التسلسل الأطول.


استخدامات عملية:

  • دمج البيانات: مثل دمج قائمة أسماء مع عناوين.
  • العمليات الزوجية: مثل جمع عناصر متقابلة في قائمتين.
  • إنشاء Dictionary: بدمج قائمة مفاتيح وقائمة قيم.


مثال على إنشاء Dictionary باستخدام Zip():


var keys = new List<string> { "ID", "Name", "Email" };
var values = new List<string> { "1", "Mahmoud", "mahmoud@example.com" };

var dictionary = keys.Zip(values, (key, value) => new { key, value })
                     .ToDictionary(x => x.key, x => x.value);

foreach (var item in dictionary)
{
    Console.WriteLine($"{item.Key}: {item.Value}");
}


الناتج:


ID: 1
Name: Mahmoud
Email: mahmoud@example.com


مثال على دمج 3 تسلسلات (ابتداءً من .NET 6):


var sequence1 = new[] { "A", "B", "C" };
var sequence2 = new[] { 1, 2, 3 };
var sequence3 = new[] { true, false, true };

var result = sequence1.Zip(sequence2, sequence3, (first, second, third) => $"{first}-{second}-{third}");

foreach (var item in result)
{
    Console.WriteLine(item);
}


الناتج:


A-1-True
B-2-False
C-3-True

تم استخدام `Zip()` لدمج ثلاث مجموعات في تسلسل واحد يحتوي على عناصر مدمجة من الثلاثة.



ملاحظات إضافية:

  • تحقق من null: تأكد من أن التسلسلات ليست فارغة لتجنب ArgumentNullException.
  • Zip لـ 3 عناصر: متوفرة بدءًا من .NET 6 فما فوق.

تعليقات

المشاركات الشائعة من هذه المدونة

C# - Arrays

Entity Framework - ما هو ORM؟ ونبذة عن Dapper وNHibernate

Entity Framework - مقدمة عن Entity Framework