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 فما فوق.
تعليقات
إرسال تعليق