Jak do funckji przekazać fragment tablicy?

Jak do funckji przekazać fragment tablicy?
HI
  • Rejestracja:ponad 18 lat
  • Ostatnio:ponad 2 lata
0

Witam,

Napisałem sobie taką metodę:

Kopiuj
        private Byte Product(Byte[] vector1, Byte[] vector2)
        {
            Byte result = 0;

            result ^= Mul(vector1[0], vector2[0]);
            result ^= Mul(vector1[1], vector2[1]);
            result ^= Mul(vector1[2], vector2[2]);
            result ^= Mul(vector1[3], vector2[3]);

            return result;
        }

W miejscu jej wywołania chciałbym przekazać do niej tylko fragment pewnej innej tablicy:

Kopiuj
...
Byte[] test = new Byte[100];

this.Product(test+1, test+50); //tutaj chciałbym przekazać "wskaźnik" na fragment tablicy

Istnieje jakiś sposób w C# żeby to funkcjonowało?

Dziękuję i pozdrawiam,
HIOB.

edytowany 1x, ostatnio: HIOB
1

Chyba niezbyt ładnie, ale taka jest moja pierwsza myśl, w sumie nie wiem czemu nie przekażesz całej i odpowiednio nie ustawisz pętli, no ale to już tylko i wyłącznie Twoja sprawa :)

Kopiuj
this.Product(test.Take(50).ToArray(), test.Skip(50).Take(50).ToArray());
Azarien
jeśli zależy nam na prędkości, to może być wolniejsze bo dane są kopiowane.
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 18 godzin
0
Kopiuj
private Byte Product(Byte[] vector1, Byte[] vector2)
        {
            Byte result = 0;
 
            result ^= Mul(vector1[0], vector2[0]);
            result ^= Mul(vector1[1], vector2[1]);
            result ^= Mul(vector1[2], vector2[2]);
            result ^= Mul(vector1[3], vector2[3]);
 
            return result;
        }

A gdzie wymuszasz, by te tablice miały dokładnie 4 elementy?

HI
  • Rejestracja:ponad 18 lat
  • Ostatnio:ponad 2 lata
1

"Emfałsi" - a skąd wiząłeś metody "Take" i "Skip" - gdyby mi to działało, to właśnie o takie coś mi chodziło :)
"Azarien" - to tylko przykładowa metoda -> chodzi mi o to, żeby przekazać do metody fragment tablicy (np. od komórki 10 do końca).

Edit.

Już mam, trzeba dodać bibliotekę "linq".

Dzięuję i pozdrawiam,
HIOB.

edytowany 1x, ostatnio: HIOB
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:4 dni
  • Lokalizacja:Wrocław
1

To nie można przekazać do funkcji indeksy początkowe i końcowe?

Kopiuj
 
private byte Product(byte[] tablica, int start, int koniec)

Zabawy z LINQ w tym przypadku, to trochę przerost formy nad treścią.

Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 18 godzin
1

A może po prostu potworzyć klasy czy struktury odpowiednie, a nie tak operować na „żywych tablicach” bez kontroli rozmiarów, indeksów itp.

Jakoś nigdy nie mam potrzeby robić zwykłej tablicy w C#...

edytowany 1x, ostatnio: Azarien
msm
Administrator
  • Rejestracja:prawie 16 lat
  • Ostatnio:5 miesięcy
2

Jest taka ciekawa struktura, niestety dość zaniedbana na początku przez co trochę zmarnowano jej potencjał, jak ArraySegment<T> (trochę poprawiona w .NET 4.0), ale mimo wszystko się nada:
http://msdn.microsoft.com/en-us/library/1hsbd92d.aspx

Poza tym, dość uniwersalnym sposobem jest przekazywanie IEnumerable<T>. W (znowu) .NET 4.0 jest nawet ładna funkcyjna funkcja Enumerable.ZipWith, przez co twój kod redukuje się do jednej linijki w ten sposób.

Azarien
w jaki sposób poprawiono ArraySegment, bo w opisie nie widzę różnicy? a Enumerable.Zip łatwo samemu napisać ;-)
msm
Poprawka, będzie dopiero w 4.5, czyli 4.0 dalej bezużyteczne... :/ W jaki sposób - interfejsy implementowane w wersji 4.5 - List<T>, ICollection<T>, IReadOnlyList<T>, IReadOnlyCollection<T>, IEnumerable<T>, IEnumerable. Interfejsy implementowane do wersji 4.0 - brak... Inaczej mówiąc, dla ArraySegment w 1.0-4.0 nie da się napisać żadnego ogólnego kodu, nawet foreach na tym nie działa.
Azarien
no faktycznie, bo w tej chwili to to jest po prostu struktura z trzema polami i nic więcej - takie coś to każdy głupi potrafi zrobić ;-)
HI
  • Rejestracja:ponad 18 lat
  • Ostatnio:ponad 2 lata
0

Witam,

"somekind" - mógłbym przekazywać indeksy, ale jak np. mam trzy tablice, to robi się to strasznie niewygodne.
"Azarien" - no ja zazwyczaj też nie mam, ale w tym konkretnym przypadku nie widzę innej możliwości.
"MSM" - dokładnie o coś takiego mi chodziło, póki co wykorzystałem sposób "emfałsi".

Bardzo dziękuję raz jeszcze za wszystkie odpowiedzi.
Pozdrawiam, HIOB.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.