Jak wywolac tablice przez "return"?

0

Witam,

Oto kod w C#:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Mnozenie_tablicy
{
    class Program
    {
        static int Mnozenie(int [] arr, int b)
        {
            for (int i = 0; i < arr.Length; i++)
            {
                arr[i] *= b;
            }
            foreach (int x in arr)
            {
                return x;
            }


        }

        static void Main(string[] args)
        {
            int B = int.Parse(Console.ReadLine());
            int[] ARR = new int[4];
            for (int c = 0; c < 4; c++)
            {
                ARR[c] = int.Parse(Console.ReadLine());
            }
            Console.WriteLine(Mnozenie(ARR, B));
            Console.ReadKey();
        }
    }
}```

Nie wiem co zmienic, a program nie chce dzialac.
0

Co ci konkretnie nie działa, zdebuguj go podglądając w poszczególnych krokach wartości zmiennych. Masz błąd return może być tylko raz wywołany a ty go wywołujesz w pętli w metodzie mnóż. Jak chcesz zwrócić to co w tablicy to zwracasz tablicę po prostu a nie po kolei każdą wartość.

0

Z wyświetlaniem tablicy też może być problem ;-)

   class Program
    {
        static int[] Mnozenie(int[] arr, int b)
        {
            for (int i = 0; i < arr.Length; i++)
            {
                arr[i] *= b;
            }
            return arr;
        }

        static void Main(string[] args)
        {
            int B = int.Parse(Console.ReadLine());
            int[] ARR = new int[4];
            for (int c = 0; c < 4; c++)
            {
                ARR[c] = int.Parse(Console.ReadLine());
            }
            ARR = Mnozenie(ARR, B);
            foreach(int i in ARR)
                Console.WriteLine(i); 
            Console.ReadKey();
        }
    }
0

Może o taki efekt ci chodzi, że funkcja zwraca wartość i zatrzymuje swoje wykonywanie do następnego wykonania i znowu zwraca.

static IEnumerable<int> Mnozenie(int [] arr, int b) 
{
  for (int i = 0; i < arr.Length; i++) {
    arr[i] *= b;
  }
  foreach (int x in arr) {
    yield return x;
  }
}
 
static void Main(string[] args) {
  int B = int.Parse(Console.ReadLine());
  int[] ARR = new int[4];
  for (int c = 0; c < 4; c++) {
    ARR[c] = int.Parse(Console.ReadLine());
  }
  IEnumerable<int> element = Mnozenie(ARR, B));
  foreach(int i in element) {
    Console.WriteLine(i);
  }
  Console.ReadKey();
}
1
static IEnumerable<int> Mnozenie(int [] arr, int b) 
{
  for (int i = 0; i < arr.Length; i++) {
     yield return arr[i]*b;
  }
}

Ale gafa xd

0
Trzeźwy Ogórek napisał(a):
static IEnumerable<int> Mnozenie(int [] arr, int b) 
{
  for (int i = 0; i < arr.Length; i++) {
     yield return arr[i]*b;
  }
}

Ale gafa xd

Mam dwa pytanka:

Czy takiego yield returna powinno używać się "gdzie tylko się da"?

Czy opłaca się go stosować, jeżeli wiemy, że będziemy działali na wszystkich elementach kolekcji? nie prościej po prostu zwrócić całą kolekcję?

#edit

Plik, na którym przeprowadziłem test miał rozmiar ok. 190MB i nieco ponad milion linii. W przypadku pierwszej wersji metody program wykonywał się 4 sekundy i zajął 430MB pamięci. Przy drugiej wersji metody czas wyniósł 2,9 sekundy, natomiast program w pamięci zajął jedynie 6MB. Jak widać zastosowanie instrukcji yield znacznie poprawiło wydajność rozwiązania, szczególnie w zakresie zapotrzebowania na pamięć. Efekt ten został osiągnięty dzięki temu, że nie było potrzeby generowania i umieszczania w pamięci całej kolekcji przed rozpoczęciem jej przetwarzania.

https://mndevnotes.wordpress.com/2012/08/18/instrukcja-yield-return-tworzenie-leniwych-kolekcji-danych/

huh

1 użytkowników online, w tym zalogowanych: 0, gości: 1