16.07.2014 Views

LINQ to Objects w C# 4.0 - Helion

LINQ to Objects w C# 4.0 - Helion

LINQ to Objects w C# 4.0 - Helion

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

68 Rozdzia 3. Pisanie podstawowych zapyta<br />

List contacts = Contact.SampleData();<br />

IEnumerable q = from c in contacts<br />

where c.State == "WA"<br />

orderby c.LastName,<br />

c.FirstName ascending<br />

select c;<br />

Zwracanie typu innego ni ródo — IEnumerable<br />

W projekcji za pomocą wyrażenia select może być zwrócony dowolny typ, nie tylko<br />

typ źródła. Typem docelowym może być dowolny dostępny typ, który mógłby być<br />

„ręcznie” skonstruowany za pomocą instrukcji new w zakresie pisanego kodu.<br />

Jeśli tworzony typ posiada konstruk<strong>to</strong>r z parametrami zawierający wszystkie parametry,<br />

jakich potrzebujesz, <strong>to</strong> wystarczy, że wywołasz ten konstruk<strong>to</strong>r. Jeśli żaden z konstruk<strong>to</strong>rów<br />

nie odpowiada parametrowi potrzebnemu dla tej projekcji, utwórz taki lub<br />

rozważ użycie składni <strong>C#</strong> 3.0 służącej do inicjalizacji typów (opisanej w rozdziale 2.).<br />

Korzyść wynikająca z użycia nowego rodzaju inicjaliza<strong>to</strong>ra polega na tym, że nie musisz<br />

definiować określonego konstruk<strong>to</strong>ra za każdym razem, kiedy potrzebna jest nowa sygnatura<br />

projekcji do obsłużenia zapytania w nowym kształcie. Kod w listingu 3.7 pokazuje,<br />

jak wykonać projekcję IEnumerable za pomocą obu konstruk<strong>to</strong>rów.<br />

Listing 3.7. Projekcja do kolekcji nowego typu — skonstruowanej za pomoc okrelonego konstruk<strong>to</strong>ra<br />

lub za pomoc skadni inicjalizacji<br />

List contacts = Contact.SampleData();<br />

// uycie konstruk<strong>to</strong>ra z parametrami<br />

IEnumerable q1 =<br />

from c in contacts<br />

select new ContactName(<br />

c.LastName + ", " + c.FirstName,<br />

(DateTime.Now - c.DateOfBirth).Days / 365);<br />

// uycie skadni inicjalizowania typów<br />

// uwaga: typ wymaga konstruk<strong>to</strong>ra bez parametrów<br />

IEnumerable q2 =<br />

from c in contacts<br />

select new ContactName<br />

{<br />

FullName = c.LastName + ", " + c.FirstName,<br />

YearsOfAge =<br />

(DateTime.Now - c.DateOfBirth).Days / 365<br />

};<br />

// definicja klasy ContactName<br />

public class ContactName<br />

{<br />

public string FullName { get; set; }<br />

public int YearsOfAge { get; set; }

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!