Tylko dla odniesienia, tutaj jest tabela z jakimś starym stylu 2 .NET List<>
Metody instancji i ich równoważne metody rozszerzeń w Linq:
METHOD IN List<> METHOD IN Linq
------------------------------------------------------------------------------------------
list.Contains(item) query.Contains(item)
list.Exists(x => x.IsInteresting()) query.Any(x => x.IsInteresting())
list.TrueForAll(x => x.IsInteresting()) query.All(x => x.IsInteresting())
list.Find(x => x.IsInteresting()) query.FirstOrDefault(x => x.IsInteresting())
list.FindLast(x => x.IsInteresting()) query.LastOrDefault(x => x.IsInteresting())
list.FindAll(x => x.IsInteresting()) query.Where(x => x.IsInteresting())
list.ConvertAll(x => x.ProjectToSomething()) query.Select(x => x.ProjectToSomething())
Oczywiście niektóre z nich nie są całkowicie równoważne. W szczególności Linq's Where
i Select
używają odroczonego wykonywania, natomiast FindAll
i ConvertAll
z List<>
wykona natychmiast i zwróci referencję do nowej instancji List<>
.
FindLast
będzie często szybszy niż LastOrDefault
, ponieważ FindLast
faktycznie wyszukuje począwszy od końca. Z drugiej strony LastOrDefault(predicate)
zawsze przechodzi przez całą sekwencję (począwszy od pierwszego elementu), a następnie zwraca najbardziej "ostatnie" dopasowanie.
Podejrzewam, że tak, ale dobrze jest usłyszeć potwierdzenie od kogoś, kto ma więcej przedstawicieli niż ja (uśmiech). Czy w ten sam sposób traktujesz wszystkie przypadki skrajne? (Pusty zbiór, nic co pasuje, inne wyjątkowe warunki) –
@Joe: Tak. Daje ci te same wyniki - pierwszy mecz, lub 'default (T)' w przypadku braku pasujących elementów. Jest efektywnie identyczny, z tym wyjątkiem, że działa na dowolnym 'IEnumerable' –