Czy LINQ rzeczywiście wykonuje głęboką kopię wyników do innej listy/tablicy/etc, czy po prostu daje mi listę/tablicę/etc. składa się z odniesień do oryginału?Czy nowa pamięć LINQ podczas tworzenia zwraca
Odpowiedz
To zależy od tego, czy (i jak) używasz Wybierz, aby rzutować wyniki.
Jeśli nie utworzysz nowych obiektów w rzucie, wynik odniesie te same obiekty co kolekcja oryginalna.
Jeśli jednak utworzysz nowe obiekty w projekcie, to oczywiście nie będą one takie same.
Kolekcja powrócił tu będzie zawierać odniesienia do tych samych obiektów w _myCollection
:
from m in _myCollection
where m.SomeFilterCriteria
select m
Zbiory powrócił w tych przypadkach nie będzie:
from m in _myCollection
where m.SomeFilterCriteria
select new { m.Prop1, m.Prop2 }
W tym przypadku warto zwrócić uwagę te Prop1 i Prop2 nowego anonimowego obiektu - jeśli są to typy odniesienia - będą zawierały odniesienie do obiektu tego samego obiektu. Tylko odniesienia najwyższego poziomu w kolekcji będą różne.
Zasadniczo - nic w .Net poza serializerami (jak wspomniano tutaj w innym miejscu) będzie "głęboko" kopiować, chyba że go zaimplementujesz.
lub
from m in _myCollection
where m.SomeFilterCriteria
select m.Clone()
Ponownie, byłoby błędem zakładać, że każdy „głębokie” kopiowanie tu się dzieje. Oczywiście implementacja Clone
będzie w tej klasie i może być wszystkim, włączając w to głębokie kopiowanie, ale to nie jest dane.
W twoim ostatnim przykładzie, myślałem, że 'Klon()' wykonał tylko płytką kopię. –
Klon będzie kopiował, ale został zaimplementowany, aby to zrobić. Nie ma domyślnego .Clone - musisz go zaimplementować dla dowolnego obiektu, na którym chcesz go obsługiwać. Moja odpowiedź odnosi się tylko do referencji najwyższego poziomu w kolekcji. Nic "głębokiego" nie kopiuje w .Net. –
@Joel B: Aby dodać komentarz do qstarin, [artykuł MSDN] (http://msdn.microsoft.com/en-us/library/system.icloneable.clone.aspx) stwierdza wprost, że "Klon może być zaimplementowany albo jako kopia głęboka lub płytka kopia. "Zatem nie tylko skopiuje kopię, ale została zaimplementowana, ale płytka i głęboka kopia to ** dwie ** dopuszczalne implementacje zgodnie z dokumentacją MSDN. Co ciekawe, obiekt ma chronionego członka [MemberwiseClone] (http://msdn.microsoft.com/en-us/library/system.object.memberwiseclone.aspx) do wykonywania płytkich kopii. – Brian
To, co zwraca, jest bardzo zależne od metody LINQ, do której się odnosisz. Ale z wyjątkiem kilku metod, które jawnie kopiują wyliczenie (na przykład), ogólny wzorzec nie kopiuje wejścia do nowej struktury. Zamiast tego woli leniwą ocenę.
Jeśli ponownie przeczytacie pytanie, okaże się, że ToList() i ToArray() nie są specjalne. :) – bzlm
@bzlm, nie jestem pewien, jak pytanie jest związane z tą częścią mojej odpowiedzi. Chciałem je konkretnie nazwać 2 metodami LINQ, które chętnie oceniają dane wejściowe i tworzą dla nich nową strukturę kolekcji, zanim przedstawię szerszą wypowiedź na temat pozostałych. Nie powiedziałem, że zrobił on głęboką kopię, więc nie jestem pewien, o czym mówisz. – JaredPar
@JaredPar Pytanie brzmi: "Czy LINQ rzeczywiście wykonuje głęboką kopię [...] lub czy po prostu daje mi listę [...] złożoną z odniesień do oryginału". Twoja odpowiedź dotyczy tego, czy * wyliczenia * są oceniane. Dobrze? – bzlm
Czy LINQ rzeczywiście wykonuje głęboką kopię wyników na inną listę/tablicę/etc, czy po prostu daje mi listę/tablicę/etc. składa się z odniesień do oryginału?
Od Enumerable.ToArray. (Tekst podobne znajdują się Enumerable.ToList)
ToArray (IEnumerable) siły Sposób natychmiastowa ocena zapytania i zwraca tablicę zawierającą wyniki zapytania. Możesz dodać tę metodę do zapytania, aby uzyskać buforowaną kopię wyników zapytania.
Cóż, to na pewno wygląda na zagmatwane.
- zwraca tablicę zawierającą zapytanie wyniki
- uzyskania buforowane kopia wyników zapytania
Od pierwszego zdania, to jest oczywiste, że nie kopie elementów w zapytaniu są wykonane.
Od drugiego zdania otrzymuje się kopię wyników zapytania jako całość, ale jest to płytka kopia od bez kopii pozycji w zapytaniu..
- 1. Błąd podczas tworzenia kwerendy LINQ
- 2. HTML5 Nowa pamięć podręczna nie jest stosowana
- 3. Czy LINQ zwraca głęboką kopię kolekcji?
- 4. Uszkodzenie modelu domeny POCO podczas tworzenia klas jednostek LINQ?
- 5. PHImageManager.requestImageForAsset zwraca zero podczas tworzenia miniatur dla wideo
- 6. LINQ: Prosta funkcja logiczna zwraca LINQ Wyjątek
- 7. tablica znaków jako pamięć dla miejsca docelowego nowa
- 8. Wolna pamięć podczas pętli
- 9. Czy "__module__" jest gwarantowane podczas tworzenia klasy?
- 10. Czy istnieje zdarzenie System podczas tworzenia procesów?
- 11. Podczas tworzenia virtualenv
- 12. Jak domyślnie nowa klasa jest publiczna podczas tworzenia jej w Visual Studio?
- 13. Zamówienie LINQ. Czy zawsze zwraca tę samą uporządkowaną listę?
- 14. Metoda Linq do tworzenia sekwencji oddzielnych obiektów?
- 15. Dlaczego nowa data (1970, 0, 1) .getFullYear() zwraca 1969?
- 16. Metoda tworzenia OpenERP zwraca błąd odmowy dostępu
- 17. nowa data(). GetTime() nie zwraca znacznika czasu w milisekundach
- 18. Dlaczego moje polecenie LINQ zwraca wartość IEnumerable?
- 19. Czy pamięć UIWebView wycieka?
- 20. Linq Query zwraca niepoprawny zestaw wyników
- 21. Lists.newArrayList kontra nowa ArrayList
- 22. Używanie „powrót” podczas tworzenia obiektów z „nowych”
- 23. Nadpisanie java podczas tworzenia obiektu
- 24. użyciu LINQ zwraca oddzielonych przecinkami ciąg
- 25. Przyczyna awarii podczas tworzenia użytkownika
- 26. Czy funkcje tworzenia zużywają więcej pamięci
- 27. Czy mremap "inicjalizuje" pamięć na wzrost?
- 28. weka.core.UnassignedDatasetException podczas tworzenia niewyznakowanego wystąpienie
- 29. outofmemoryerror podczas tworzenia mapy bitowej
- 30. Obsługa obrazów podczas tworzenia oprogramowania
Nic w .NET - z wyjątkiem może serializacji - zawsze automatycznie tworzy głęboką kopię czegokolwiek. Jednym z powodów jest to, że kopie głębokie nie są trywialne do automatycznego konstruowania. – bzlm
@bzlm - więc kiedy edytuję wynik zapytania LINQ, faktycznie edytuję wartość elementu z pierwotnej kolekcji? –
Tak, jesteś. Spróbuj. :) – bzlm