كيفية تكرار أكثر الأناقة من خلال مجموعات متوازية في C #؟
-
11-09-2019 - |
سؤال
var a = new Collection<string> {"a", "b", "c"};
var b = new Collection<int> { 1, 2, 3 };
ما هي الطريقة الأكثر أناقة للتكرار من خلال كل من مجموعة من النتائج "A1"، "B2"، "C3"؟
المحلول
هذا هو المعروف باسم "zipping" أو "الرمز البريدي" تسلسلتين. اريك ليبيرت يصف هذه الخوارزمية جدا ويوفر تنفيذ.
نصائح أخرى
المحادثات العظيمة بارت دي شيت حول وظائف الرمز البريدي هنا:
يستفيد محلوله الأكثر أناقة من الحمل الزائد من الاختيار الذي يأخذ مندوب فون المعلمة 2 كمعلمة لها.
a.Select((t,i)=>new{t,i});
في هذا المثال، أنا ببساطة تمثل مؤشر العنصر الذي تتم معالجته. حتى تتمكن من إنشاء 2 عديدة جديدة من هذه الأشياء المجهولة والانضمام إليهم.
الأداء الحكيم، سأذهب مع حلقة العائد الأكثر وضوحا.
لاستكمال المشاركات الرائعة من قبل ERIC و BART، وهنا تنفيذ باستخدام مشغلي System.linq 3.5:
public static IEnumerable<TResult> Zip<TFirst, TSecond, TResult> (
this IEnumerable<TFirst> first,
IEnumerable<TSecond> second,
Func<TFirst, TSecond, TResult> resultSelector)
{
return from aa in a.Select((x, i) => new { x, i })
join bb in b.Select((y, j) => new { y, j })
on aa.i equals bb.j
select resultSelector(aa.x, bb.y);
}
يمكنك إنشاء كتلة للماءات الكهربائية للتعامل مع هذا بأناقة:
public static class Ext
{
public static IEnumerable<string> ConcatEach(this IEnumerable a,
IEnumerable b)
{
var aItor = a.GetEnumerator();
var bItor = b.GetEnumerator();
while (aItor.MoveNext() && bItor.MoveNext())
yield return aItor.Current.ToString() + bItor.Current;
}
}
نسميها بأناقة =) كما:
var a = new Collection<string> {"a", "b", "c"};
var b = new Collection<int> {1, 2, 3};
foreach(var joined in a.ConcatEach(b))
{
Console.WriteLine(joined);
}
لا تنتمي إلى StackOverflow