2009-04-24 15 views
6

Kafamı LINQ'a sokmak için uğraşıyorum ve C# 'daki kendi uygulamamın yakınında bulunana kadar düzinelerce örnek arayışının bana nasıl balık tutulacağını öğretmediği sonucuna vardık.MSDN'de Select yöntem belgelerini nasıl çözerim?

Hemen bir tuğla duvara çarptığım belgelere geri dönün. msdn http://msdn.microsoft.com/en-us/library/bb548891.aspx burada sunulan ve IntelliSense tarafından bir ipucu olarak verildiği gibi

biri bana Enumerable.Select yöntemini deşifre yardım eder misiniz? o başvurmak için yardımcı olur

Enumerable.Select (TSource, TResult) Yöntem (IEnumerable (TSource>), Func (TSource, TResult)) İşte

satır numaraları ile bozuldu aynı çizgidir:

  1. Enumerable.Select
  2. (TSource, TResult)
  3. yöntem
  4. (IEnumerable (TSource>),
  5. Işlev
  6. (TSource, TResult))

cevap

7

Size bakın MSDN makalesinden, C# Bu yöntemin tanımı bakmak yardımcı olabilir: Bu genel yöntem için tip parametrelerini belirtmek

public static IEnumerable<TResult> Select<TSource, TResult>(
    this IEnumerable<TSource> source, 
    Func<TSource, TResult> selector 
) 

< açılı ayraçlar > ve biz Yöntemin amacını, sadece tip parametrelerinin ne yaptığını inceleyerek keşfetmeye başlayın.

Select<TSource, TResult> 

Bu yöntem iki farklı türde Select fırsatları denilen söyler:

Biz jenerik yöntemin adına bakarak başlamak

  • tip TSource; ve
  • tip TResult

en parametreleri bakalım:

  1. İlk parametre IEnumerable<TSource> source - bir TSource sayımını sağlayan bir kaynak. Bir TSource alır ve TResult haline döner bir selektör fonksiyonu -
  2. ikinci parametre Func<TSource, TResult> selector olup.

Sonra onun dönüş değeri bakmak (Bu Func tanımını keşfederek doğrulanabilir):

IEnumerable<TResult> 

Biz şimdi bu yöntem TResult numaralandırma dönecektir biliyorum.

Özetlemek gerekirse, TSource bir sayımını alır bir işlev ve bireysel TSource öğeleri alır ve TResult öğeleri döndürür ve sonra tüm seçme işlevi TResult bir sayımını döndüren bir selektör fonksiyonu var.

Bir örnek:

somut koşulları yerleştirmek için TSource tip Person (a ad, yaş, cinsiyet, vb ile bir kişiyi gösteren sınıfı) ve TResult ait değildir olduğunu söylemek sağlar String yazın (kişinin adını temsil eden). Biz Select fonksiyonu Person s listesini vereceğim ve verilen bir Person sadece kendi ismini seçecektir bir işlev ediyoruz. Bu Select işlevini çağıran çıktı olarak, sadece insanların isimlerini içeren String s listesini alacağız. Kenara

:

orijinal yöntem imzadan bulmacanın son parçası, üst kısmında, birinci parametreden önce this anahtar kelimedir. Bu Extension Methods tanımlamak için sözdizimi parçasıdır ve aslında anlamı hepsi sadece sanki yerine statik seç yönteminin çağrılmasının (kaynak numaralandırma geçen ve seçici fonksiyonu) Eğer sadece numaralandırma üzerinde doğrudan seç yöntemini çağırmak olmasıdır Bir Select yöntemine sahipti (ve sadece bir parametrede - seçici işlevi).

bunun senin için daha açık hale getireceğini umuyoruz?

5

Select düşünmek yolu eşleme olarak bir dizinin her elemanıdır. Dolayısıyla:

Enumerable.Select<TSource, TResult>: Seç yöntem kaynak ve sonuç türleri Parametreleştirilen edilir

IEnumerable<TSource> (eğer eşleştirdiğimize şeyin tipi ve türü Bu bütçeyi eşleştirdiğimize): şeylerin sırası

haritaya

Func<TSource, TResult>: kaynak dizisi

bir IEnumerable<TResult>, eşleştirme sonuçlarının bir sekans olan sonuç her bir elemanı uygulanacak eşleştirme işlevi.

IEnumerable<string> strings = ints.Select(i => i.ToString()); 

İşte IntS

IEnumerable<TSource> ( IEnumerable<int>) ve i => i.ToString() Func<TSource, TResult> ( Func<int, string>) 'dir:

Örneğin, dize temsilleri için tamsayı dizisi haritalama (önemsiz bir örnek olarak) düşünebiliriz.

+0

Bu ayrıntılı yanıt için teşekkürler. Enumerable.Select kelimesini yazan "Yöntem" anahtar kelimesi bir yöntem midir? Sanırım bu gibi herhangi bir yardım hattını nasıl çözebilirim? –

+0

Evet, doğru. MSDN konusunun başlığı size üyenin adını, tür (yöntem, özellik, olay, alan) ve aşırı yüklü yöntemler için baktığınız aşırı yükün imzasını anlatıyor. (Enumerable.Select söz konusu olduğunda, iki aşırı yüklenme vardır, onların haritalama işlevi türleri tarafından ayırt edilirler.) – itowlson

0

C# in Depth'un sonraki bölümlerinin LINQ'u açıklamak için iyi bir iş yaptığını ve bunun ne anlama geldiğini düşünüyorum. Ayrıca kitabın geri kalanı diğer çok yararlı C# bilgisini öğrenir.

+0

Teşekkürler Marc, kitabım var ama yararlı bulmuyorum. Konuları anladığımda mükemmel bir anlam ifade edeceğinden eminim. –

+0

@David: Daniel'in cevabı, Derinlikteki C# 'dan sizin için daha netse, onu iyileştirmek için Derinlikteki C# hangi alanların değiştirilmesi gerektiğini önerebilir misiniz? İkinci baskıyı bir araya getirmeye başlıyorum, bu yüzden geri bildirim çok yararlı olurdu! –