2011-09-09 20 views
28

Napotkałem czysto hipotetycznej problem, który czuje się jak to ma proste rozwiązanie, jeśli znajdę właściwą metodę linq ...Dodawanie/zsumowanie dwóch tablic

Mam dwie tablice wskazówki i wiem, że są ten sam rozmiar. Chcę utworzyć trzecią tablicę o tym samym rozmiarze, gdzie elementy w trzeciej tablicy są sumą elementów w pierwszych dwóch tablicach w odpowiedniej pozycji.

Poniżej znajduje się metoda, która powinna pokazać, co chcę zrobić.

public static int[] AddArrays(int[] a, int[] b) 
{ 
    int[] newArray = new int[a.Length]; 
    for (int i = 0; i<a.Length; i++) 
    { 
     newArray[i]=a[i]+b[i]; 
    } 
    return newArray; 
} 

Czy istnieją jakieś metody Linq, że mogę po prostu użyć jak

return a.DoStuff(b, (x,y) => x+y) 

czy coś takiego?

Muszę zauważyć, że to prawdopodobnie należy do kategorii zadań domowych, ponieważ pierwotny problem pochodzi z witryny, na którą patrzyłem (chociaż nie mogę znaleźć bezpośredniego linku do problemu), a nie jako pytanie, którego potrzebuję do praca lub cokolwiek.

Jeśli nie istnieje prosta metoda, to jaki jest najlepszy sposób Linqy? array.each wydaje się mieć problem polegający na tym, że nie jest w stanie zindeksować drugiej macierzy, łatwo dodając wartości do iteracji, prowadząc mnie do zastanowienia się, czy Linq byłby jakąkolwiek pomocą w tej sytuacji ...

+1

FYI, to jest zwykle nazywane „zip” (analogia zamek powinno być oczywiste) i LINQ ma wbudowane wsparcie dla niego, z wyjątkiem być może poprzez 'SelectMany'./EDIT Wygląda na to, że nie jest już prawdą w obecnej wersji. –

+0

Zip tych ludzi odpowiedział, że jest dostępna tylko na .NET 4 – Zenwalker

+0

@zenwalker: tak i dlatego lepiej uaktualnić wersję Framework tak szybko, jak to możliwe, bardzo fajne funkcje są;) – sll

Odpowiedz

41

Zip it :)

var a = new int[] {1,2,3 }; 
var b = new int[] {4,5,6 }; 
a.Zip(b, (x, y) => x + y) 
+0

Niesamowite, dziękuję za pokazanie tego! – Austin

1
IList<int> first = new List<int> { 2, 3, 4, 5 }; 
IList<int> second = new List<int> { 2, 3, 4, 5 }; 

var result = Enumerable.Zip(first, second, (a, b) => a + b); 
10

można użyć Wybierz metodę.

int[] a = new[] { 1, 2, 3 }; 
int[] b = new[] { 10, 20, 30 }; 

var c = a.Select ((x, index) => x + b[index]).ToArray(); 
+1

Kto przejdzie, a następnie zwiększy indeks? – sll

+3

Indeks jest dostarczany przez proces LINQ. –

+0

Dzięki, fajna funkcja! – sll

4
public static int[] AddArrays(int[] a, int[] b) 

{ 
    return a.Zip(b, (x,y) => x+y).ToArray(); 
} 
Powiązane problemy