سؤال

في بيثون هناك حقا أنيق وظيفة تسمى zip والتي يمكن استخدامها للتنقل عبر القوائم اثنين في نفس الوقت:

list1 = [1, 2, 3]
list2 = ["a", "b", "c"]
for v1, v2 in zip(list1, list2):
    print v1 + " " + v2

رمز أعلاه يجب أن ينتج التالية:

1 a
2 b
3 c

وأتساءل عما إذا كان هناك طريقة مثل ذلك المتاحة في .الشبكة ؟ أنا أفكر في كتابة هذا بنفسي, ولكن لا يوجد أي نقطة إذا كانت متاحة بالفعل.

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

المحلول

تحديث:أنها بنيت في C# 4 System.Linq.Enumerable.Zip طريقة

هنا هو C# 3 الإصدار:

IEnumerable<TResult> Zip<TResult,T1,T2>
    (IEnumerable<T1> a,
     IEnumerable<T2> b,
     Func<T1,T2,TResult> combine)
{
    using (var f = a.GetEnumerator())
    using (var s = b.GetEnumerator())
    {
        while (f.MoveNext() && s.MoveNext())
            yield return combine(f.Current, s.Current);
    }
}

انخفض C# 2 الإصدار كما كان يظهر عصرها.

نصائح أخرى

بقدر ما أعرف لا يوجد.كتبت واحدة لنفسي (فضلا عن عدد قليل من غيرها من الملحقات المفيدة ووضعها في مشروع يسمى NExtension على Codeplex.

على ما يبدو موازية ملحقات .صافي يكون الرمز البريدي وظيفة.

هنا هو نسخة مبسطة من NExtension (ولكن يرجى التحقق من ذلك عن أكثر فائدة أساليب الإرشاد):

public static IEnumerable<TResult> Zip<T1, T2, TResult>(this IEnumerable<T1> source1, IEnumerable<T2> source2, Func<T1, T2, TResult> combine)
{
    using (IEnumerator<T1> data1 = source1.GetEnumerator())
    using (IEnumerator<T2> data2 = source2.GetEnumerator())
        while (data1.MoveNext() && data2.MoveNext())
        {
            yield return combine(data1.Current, data2.Current);
        }
}

الاستخدام:

int[] list1 = new int[] {1, 2, 3};
string[] list2 = new string[] {"a", "b", "c"};

foreach (var result in list1.Zip(list2, (i, s) => i.ToString() + " " + s))
    Console.WriteLine(result);

لا, لا يوجد مثل هذه الوظيفة .صافي.لديك لفة الخاص بك.لاحظ أن C# لا يدعم الصفوف ، لذلك الثعبان جملة مثل السكر مفقود أيضا.

يمكنك استخدام شيء من هذا القبيل:

class Pair<T1, T2>
{
    public T1 First { get; set;}
    public T2 Second { get; set;}
}

static IEnumerable<Pair<T1, T2>> Zip<T1, T2>(IEnumerable<T1> first, IEnumerable<T2> second)
{
    if (first.Count() != second.Count())
        throw new ArgumentException("Blah blah");

    using (IEnumerator<T1> e1 = first.GetEnumerator())
    using (IEnumerator<T2> e2 = second.GetEnumerator())
    {
        while (e1.MoveNext() && e2.MoveNext())
        {
            yield return new Pair<T1, T2>() {First = e1.Current, Second = e2.Current};
        }
    }
}

...

var ints = new int[] {1, 2, 3};
var strings = new string[] {"A", "B", "C"};

foreach (var pair in Zip(ints, strings))
{
    Console.WriteLine(pair.First + ":" + pair.Second);
}

هناك أيضا واحد في#F:

دعونا من نوع zip = Seq.zip firstEnumeration secondEnumation

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top