كيفية تكرار أكثر الأناقة من خلال مجموعات متوازية في C #؟

StackOverflow https://stackoverflow.com/questions/1830041

سؤال

        var a = new Collection<string> {"a", "b", "c"};
        var b = new Collection<int> { 1, 2, 3 };

ما هي الطريقة الأكثر أناقة للتكرار من خلال كل من مجموعة من النتائج "A1"، "B2"، "C3"؟

هل كانت مفيدة؟

المحلول

هذا هو المعروف باسم "zipping" أو "الرمز البريدي" تسلسلتين. اريك ليبيرت يصف هذه الخوارزمية جدا ويوفر تنفيذ.

نصائح أخرى

المحادثات العظيمة بارت دي شيت حول وظائف الرمز البريدي هنا:

http://community.bartdesmet.net/blogs/bart/archive/2008/11/03/c-4-0-feature-focus-part-3-intermezzo-linq-s-new-zip-operator.aspx.

يستفيد محلوله الأكثر أناقة من الحمل الزائد من الاختيار الذي يأخذ مندوب فون المعلمة 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);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top