Czy w .NET 2.0 jest wbudowana funkcja, która pobierze dwie tablice i połączy je w jedną tablicę?
Obie tablice są tego samego typu. Otrzymuję te tablice z powszechnie używanej funkcji w mojej bazie kodu i nie mogę modyfikować funkcji, aby zwracać dane w innym formacie.
Staram się unikać pisania własnej funkcji, aby to osiągnąć, jeśli to możliwe.
Array.Resize
tak naprawdę nie zmienia rozmiaru tablicy, tylko ją kopiuje. Dlatego pierwszym parametrem jest by-ref (co oznacza, że twój pierwszy kod prawdopodobnie się nie skompiluje).W C # 3.0 możesz użyć metody Concat LINQ, aby łatwo to osiągnąć:
W C # 2.0 nie masz takiego bezpośredniego sposobu, ale Array.Copy jest prawdopodobnie najlepszym rozwiązaniem:
Można to łatwo wykorzystać do wdrożenia własnej wersji
Concat
.źródło
Użyj LINQ :
Pamiętaj, że spowoduje to usunięcie duplikatów. Jeśli chcesz zachować duplikaty, użyj Concat.
źródło
Jeśli nie chcesz usuwać duplikatów, spróbuj tego
Użyj LINQ:
źródło
Po pierwsze, zadaj sobie pytanie „Czy naprawdę powinienem tutaj używać tablicy”?
O ile nie budujesz czegoś, w którym szybkość ma ogromne znaczenie, lista na maszynie
List<int>
jest podobna . Jedynym razem, gdy korzystam z tablic, są tablice bajtowe podczas wysyłania danych przez sieć. Poza tym nigdy ich nie dotykam.źródło
List<T>
w publicznych interfejsach API: blogs.msdn.com/b/kcwalina/archive/2005/09/26/474010.aspxŁatwiej byłoby po prostu użyć LINQ :
Najpierw przekonwertuj tablice na listy i scal je ... Następnie po prostu przekonwertuj listę z powrotem na tablicę :)
źródło
Myślę, że możesz do tego użyć Array.Copy . Pobiera indeks źródłowy i docelowy, więc powinieneś być w stanie dołączyć jedną tablicę do drugiej. Jeśli potrzebujesz bardziej skomplikowanego niż tylko dołączanie jednego do drugiego, może to nie być odpowiednie narzędzie dla Ciebie.
źródło
Zakładając, że tablica docelowa ma wystarczającą ilość miejsca,
Array.Copy()
będzie działać. Możesz także spróbować użyć metody aList<T>
i jej.AddRange()
metody.źródło
Osobiście wolę własne rozszerzenia językowe, które dodam lub usunę do woli w celu szybkiego prototypowania.
Poniżej znajduje się przykład ciągów.
Jest znacznie szybszy niż LINQ i Concat. Jeszcze szybciej korzysta z niestandardowego
IEnumerable
opakowania typu, które przechowuje referencje / wskaźniki przekazanych tablic i umożliwia zapętlanie całej kolekcji, jak gdyby była to normalna tablica. (Przydatne w HPC, przetwarzaniu grafiki, renderowaniu grafiki ...)Twój kod:
Cały kod i ogólna wersja patrz: https://gist.github.com/lsauer/7919764
Uwaga: Zwraca nierozszerzony obiekt IEnumerable. Zwrócenie rozszerzonego obiektu jest nieco wolniejsze.
Kompilowałem takie rozszerzenia od 2002 roku, a wiele kredytów trafiło do pomocnych osób na CodeProject i „Stackoverflow”. Niedługo je wypuszczę i zamieszczę link tutaj.
źródło
Wszyscy mają już swoje zdanie, ale myślę, że jest to bardziej czytelne niż podejście „użyj jako metody rozszerzenia”:
Można go jednak użyć tylko w przypadku połączenia 2 tablic.
źródło
Właśnie to wymyśliłem. Działa dla zmiennej liczby tablic.
...
źródło
Wystarczy zaznaczyć to jako opcję: jeśli macierze, z którymi pracujesz, są typu pierwotnego - Boolean (bool), Char, SByte, Byte, Int16 (krótki), UInt16, Int32 (int), UInt32, Int64 (długi ), UInt64, IntPtr, UIntPtr, Single lub Double - wtedy możesz (lub powinieneś?) Spróbować użyć Buffer.BlockCopy . Zgodnie ze stroną MSDN dla klasy Buffer :
Korzystanie z C # 2.0 przykład z @ OwenP za odpowiedź za punkt wyjścia, że to działa w następujący sposób:
Nie ma prawie żadnej różnicy w składni
Buffer.BlockCopy
iArray.Copy
użytej @OwenP, ale powinno to być szybsze (nawet jeśli tylko nieznacznie).źródło
W przypadku, gdy ktoś inny szuka sposobu połączenia dwóch tablic bajtów obrazkowych:
źródło
Oto prosty przykład użycia Array.CopyTo. Myślę, że odpowiada na twoje pytanie i podaje przykład użycia CopyTo - zawsze jestem zdziwiony, kiedy muszę użyć tej funkcji, ponieważ pomoc jest nieco niejasna - indeks jest pozycją w tablicy docelowej, w której występuje wstawianie.
Myślę, że nie można tego uprościć.
źródło
Potrzebowałem rozwiązania, aby połączyć nieznaną liczbę tablic.
Zaskoczony nikt inny nie dostarcza rozwiązania z wykorzystaniem
SelectMany
zparams
.Jeśli nie chcesz odrębnych elementów, po prostu usuń wyraźne.
Uwaga: Zdecydowanie nie ma gwarancji zamówienia przy użyciu odrębnego.
źródło
Zakładam, że używasz własnych typów tablic w przeciwieństwie do wbudowanych tablic .NET:
Innym sposobem na to byłoby użycie wbudowanej klasy ArrayList.
Oba przykłady to C #.
źródło
Za pomocą powyższego kodu można łatwo połączyć dwie tablice.
źródło
Utworzono metodę rozszerzenia do obsługi wartości null
źródło
Jeśli masz tablice źródłowe w samej tablicy, możesz użyć SelectMany :
daje
Prawdopodobnie nie jest to najszybsza metoda, ale może pasować w zależności od przypadku użycia.
źródło
Ten kod będzie działał we wszystkich przypadkach:
źródło
Spróbuj tego:
źródło