SORU
3 HAZİRAN 2014, Salı


'C s ne#-deyimsel iki liste arasında bir işleç uygulamak için yolu?

Bu (diğer diller) yaptım:

 a = 1, 2, 3;
 b = 5, 1, 2;

 c = a * b;  // c = 5, 2, 6

Bu eşit büyüklükte iki liste alır ve kendi üyelerine bir işlevi, bir kerede, sonuçların bir listesini almak için geçerlidir. Bir fonksiyonu çarpım (yukarıda) veya başka bir şey daha karmaşık kadar basit olabilir:

 c = b>a ? b-a : 0;  // c = 4, 0, 0

C bunu yapmak için birkaç farklı yol isterdim# ama C nasıl emin değilim eğitimli#programcı yapar. C hakkında gidiş doğru yolu nedir# dünya?

(Soruyorum sadece bir parçasıc = f(a,b). Listeler oluşturma konusunda bilgi sahibi ve elemanları giriyorum.)

CEVAP
3 HAZİRAN 2014, Salı


var c = a.Zip(b, (x, y) => x * y);

Düzenledikten sonra: daha karmaşık biri

var c = a.Zip(b, (x, y) => x > y ? x - y : 0);

Not Zip bir uzantısı yöntem from Enumerable that acts on IEnumerable<T> Queryable that acts on IQueryable<T>, Bu yüzden mümkün olduğunu, gereken lambda olmak bir belirli bir sorgu sağlayıcı olabilir, anlaşma olabilir gibi işlenmiş bir SQL sorgu bir veritabanı veya başka bir şekilde başka bir bellek .NET.

Birisi bu yorumlar 4.0 ile yeni olduğunu belirtti. Zor değil 3.5 kendiniz için uygulamak için:

public class MyExtraLinqyStuff
{
    public static IEnumerable<TResult> Zip<TFirst, TSecond, TResult>(this IEnumerable<TFirst> first, IEnumerable<TSecond> second, Func<TFirst, TSecond, TResult> resultSelector)
    {
      //Do null checks immediately;
      if(first == null)
        throw new ArgumentNullException("first");
      if(second == null)
        throw new ArgumentNullException("second");
      if(resultSelector == null)
        throw new ArgumentNullException("resultSelector");
      return DoZip(first, second, resultSelector);
    }
    private static IEnumerable<TResult> DoZip<TFirst, TSecond, TResult>(this IEnumerable<TFirst> first, IEnumerable<TSecond> second, Func<TFirst, TSecond, TResult> resultSelector)
    {
      using(var enF = first.GetEnumerator())
      using(var enS = second.GetEnumerator())
        while(enF.MoveNext() && enS.MoveNext())
          yield return resultSelector(enF.Current, enS.Current);
    }
}

İçin .NET 2.0 veya .NET3.0 aynı, ama yorum başka bir soruya cevap olan bir uzantı yöntemi olarak alabilir; gerçekten bu tür şeyler yaparken aptalca bir yolu yoktu .En azından bizler kodlama arasında kesin bir fikir birliği yok o zaman, ya da NET .NET. Bazılarımız vardı yöntemleri gibi yukarıda bizim araçlar da uzatma yöntemleri belli ki), fakat bu ... daha fazla olduğumuzu etkilemiş diğer dilleri ve kütüphaneleri daha başka bir şey (örneğin yaptığımı şeyler gibi yukarıdaki yüzünden şeyleri biliyordum C 'ın STL, ama o da pek olası tek kaynağı ilham)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Elly Awesome

    Elly Awesome

    15 ŞUBAT 2010
  • Juan Carlos Candela Bordera

    Juan Carlos

    4 Mart 2009
  • Muse

    Muse

    28 EYLÜL 2006