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; }