Zadanie - operacje na listach - ciekawe zadanie

0

Mam taki mały problemik. Mam metode która zwraca wartość różnicy z liczb zawartych na listach odpowiednio pierwszego elementu z pierwszej listy i z pierwszym elementem drugiej listy.
Dodatkowo należy odejmować od siebie jedynie nieparzyste indeksy w obu tablicach (pozostałe pominąć). Wynik powinien być zwrócony w postaci listy.
Mam taki pomysł, ale coś nie działa. Może ktoś ma pomysł na rozwiązanie ?

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

namespace ConsoleApplication12
{
    public class Liczydlo
    {
        public List<int> liczby;
        public List<int> liczby2;
    
    public  List<int> Roznica(List<int> a, List<int> b )
    {
        List<int> tmp;
        int j = 0, i = 0;
        //List<int> len = List<int> a
        for (int i=0; i < 3; i++)
        {
            if (i % 2 != 0)
            {
                tmp[j] = a[i] - b[i];
                j++;
            }
        } return tmp;
         
    }
    
      public  static void Main(string[] args)
        {
            Liczydlo l = new Liczydlo();
            l.liczby = new List<int>();
            l.liczby.Add(1);
            l.liczby.Add(2);
            l.liczby.Add(3);
            l.liczby2 = new List<int>();
            l.liczby2.Add(1);
            l.liczby2.Add(2);
            l.liczby2.Add(3);
            List<int> roznica = l.Roznica(l.liczby, l.liczby2);
        }
   }
}

0

Skorzystaj z Linq:

            var first = new List<int>  { 6, 7, 8, 9, 0, 7, 9, 9 };
            var second = new List<int> { 1, 1, 1, 2, 0, 7, 9, 9 };
            var diff = first
                .Select((n, i) => new { Value = n, Index = i })
                .Where(n => n.Index % 2 != 0)
                .Select(n => n.Value - second[n.Index])
                .ToList();
            diff.ForEach(i => Console.WriteLine(i));

W Twoim kodzie robisz błędy np: dodajesz elementy do tmp nie posiadając obiektu: tmp[j] = a[i] - b[i]; Masz samo List<int> tmp; nie tworząc obiektu.
W ogóle tworzysz tych list za dużo etc...

Ideonik: https://ideone.com/c9wbMG

Poza tym Twój kod w ogóle się nie kompiluje...

EDIT: Naniosłem poprawkę, która działa poprawnie jeżeli wystąpią powtórzenia w pierwszym zbiorze. Można też po staremu:

        static List<int> DiffOldSchool(List<int> first, List<int> second)
        {
            var diff = new List<int>();
            for (int i = 1; i < first.Count; i += 2)
                diff.Add(first[i] - second[i]);
            return diff;
        }

Nie sprawdzam czy listy mają identyczną długość etc...

1

Nie jestem pewien czy przy błędach typu int i = 0 x2 w kodzie i List<int> tmp; zamiast List<int> tmp = new List<int>() LINQ jest dobrym pomysłem dla niego. Jeszcze przy odejmowaniu tych samych wartości z listy gdzie ma:

l.liczby.Add(1);
l.liczby.Add(2);
l.liczby.Add(3);

l.liczby2.Add(1);
l.liczby2.Add(2);
l.liczby2.Add(3);

Ja sobie to zrobiłem tak:

public List<int> Roznica(List<int> a, List<int> b)
{
     List<int> tmp =  new List<int>();
     int j = 0, x = 0;
     //List<int> len = List<int> a
     for (int i = 0; i < 10; i++)
        {
           if (i % 2 != 0)
           {
                x = a[i] - b[i];
                tmp.Add(x);
                j++;
           }
       }   
       return tmp;
}

Ale jak już widać po dodawaniu do listy wartości w liście tmp będą = 0.

0

@Wheliee:

  • Warunek w pętli niepotrzebny. Można zaczynać od jedynki gdyż 0 % 2 = 0 więc zero można pominąć, a zamiast i++ zastosować i += 2;
  • Niepotrzebne kompletnie j;
  • Niepotrzebne x.
1

To jest akurat przykład czegoś, co lepiej robić normalną pętlą niż LINQ. Nie trzeba też sprawdzać równej liczby elementów w listach:

List<int> results = new List<int>();
for (int i = 1; i < first.Count && i < second.Count; i += 2)
{
    results.Add(first[i] - second[i]);
}
return results;

To, co napisał @grzesiek51114 w LINQ ma ze dwa razy więcej znaków, więc raczej zniechęca do pisania w ten sposób. O wydajności nie wspominając.
A jeśli już się uprzeć na LINQ, to poszedłbym raczej w tę stronę:

var firstOdds = first.Where((q, i) => i % 2 == 1);
var secondOdds = second.Where((q, i) => i % 2 == 1);
var results = firstOdds.Zip(secondOdds, (a, b) => a - b);

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