LINQ Uzatma Yöntemi "Katla" nerede?


95

Ben bulundu MSDN'ın Linq örneklerinde () kullanmak istediğim o Katlama denilen düzgün bir yöntem. Örnekleri:

double[] doubles = { 1.7, 2.3, 1.9, 4.1, 2.9 }; 
double product = 
     doubles.Fold((runningProduct, nextFactor) => runningProduct * nextFactor); 

Ne yazık ki, bunu kendi örneğimde veya kendi kodumda derleyemiyorum ve MSDN'de bu yöntemden bahseden başka hiçbir yerde (Numaralandırılabilir veya Dizi genişletme yöntemleri gibi) bulamıyorum. Aldığım hata eski bir "bununla ilgili hiçbir şey bilmiyorum" hatası:

error CS1061: 'System.Array' does not contain a definition for 'Fold' and no 
extension method 'Fold' accepting a first argument of type 'System.Array' could 
be found (are you missing a using directive or an assembly reference?)

Linq'ten geldiğine inandığım diğer yöntemleri kullanıyorum (Select () ve Where () gibi) ve "System.Linq kullanıyorum", yani bence her şey yolunda.

Bu yöntem gerçekten C # 3.5'te var mı ve öyleyse, neyi yanlış yapıyorum?


3
Referans verdiğiniz örnekler sayfasındaki ekmek kırıntısı izine * göz atın - bu, gelecekteki bir ürün olarak C # 3'ü ifade eder. Gelecekteki ürünler genellikle gönderilmeden önce değişir. Bahsedilen diğerleri gibi, Numaralandırılabilir'e bakın. :) * Visual C # Developer Center> Ana Sayfa> Ürün Bilgileri> Gelecek Sürümler> 101 LINQ Örnekleri> Agrega Operatörleri
Curt Nichols

Yanıtlar:


127

AggregateUzantı yöntemini kullanmak isteyeceksiniz :

double product = doubles.Aggregate(1.0, (prod, next) => prod * next);

Daha fazla bilgi için MSDN'ye bakın . seedArdışık değerleri hesaplamak için bir ve ardından bir ifade belirtmenize olanak tanır .


4
Sizin de tohum sahibi olmanız gerekmediğine dikkat edilmelidir. Çekirdeği olmayan aşırı yüklemeyi çağırırsanız, listedeki ilk öğe ilk toplam değer olarak kullanılır ve Funcyalnızca ikinci öğeye ulaşıldığında çağrılır. Bakınız: msdn.microsoft.com/en-us/library/vstudio/…
Josh Gallagher

Doğru anlıyorsam katlanmaz: / Kat, farklı türlerdeki her iki argümanı da kabul etmelidir. Örneğin, birinci argüman olarak bir dizge kullanılabilir ve ikinci argüman olarak herhangi bir şey kullanılabilir ToString(), böylece tüm kabın bir metin temsilini döndürebilir.
Hi-Angel

@ Merhaba-Angel, hayır, örnek aslında bir katlama. <double>Tür parametresi sadece otomatik böylece gerekli değildir derleyici tarafından anlaşılabilir ve kapanır.
kdbanman

1
@ Hi-Angel pve elemistediğiniz tür olabilir. Bu örnekte kullanıldığı
şekliyle

1
@kdbanman errr, ⁺¹, o zamanlar neden benim için işe yaramadığı gerçekten ilginç…: / Haklısın, işe yarıyor.
Hi-Angel

42

Katlama (diğer adıyla Küçültme), işlevsel programlamanın standart terimidir. Nedeni ne olursa olsun, LINQ'da Aggregate olarak adlandırıldı .

double product = doubles.Aggregate(1.0, (runningProduct, nextFactor) => runningProduct* nextFactor);

9
Agrega, OO ve SQL dünyasında daha tanıdık bir terimdir.
Adam Robinson

3
CREATE AGGREGATE anahtar kelimesinin farkında değildim ( msdn.microsoft.com/en-us/library/ms182741.aspx ) Her gün yeni bir şey öğrenin.
Richard Berg

5
Komik, SQL dışında "birleştirme" yi hiç duymadım. WP, birkaç düzine dilden oluşan en.wikipedia.org/wiki/Fold_(higher-order_function) listesine sahiptir ve C #, "Aggregate" olarak adlandıran tek listedir . Açıkça kazanan "Azalt", ardından ML ailesi için "Katla" ve Smalltalk ve arkadaşları için "Enjekte" geliyor.
Ken

12
İsim, işlevselliği ile ilgili bir sorundur; nasıl uygulandığı konu dışıdır. Ve FWIW, sol kıvrımlar mümkün olduğunda yinelemeli olarak uygulanır ... işlevsel dillerde genellikle kuyruk özyineleme yoluyla. Ve C # 'nın doğru kıvrımı yoktur, bu da kısmen aptalca bir isim seçmenin bir sonucudur - "harita" için "seçmek" kadar kötü olmasa da - ve mevcut işlevsel teknolojiyi görmezden gelmektir. Aggregate'in OO dünyasında daha tanıdık bir terim olmasına gelince ... hayır, hiç de değil.
Jim Balter

9
Dürüst olmak gerekirse, Microsoft'un mevcut işlevsel teknolojiyi veya terminolojiyi göz ardı ettiğini düşünmüyorum, bunun yerine veritabanı erişimi ve SQL terminolojisine yönelik yönelim, ki birçok kurumsal programcı muhtemelen işlevsel programlama terimlerinden daha aşina.
RavuAlHemio
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.