Podwójna pętla for oraz if

0

Cześć!
Wyszukuje sobie rzeczy między listami 1 i 2 i jeżeli to znajdę powtarzającą się wartość w obu tych listach, to dodaje coś z listy 2 do listy 3. Niestety może być tak że lista 1 będzie posiadała coś czego nie posiada lista 2, w takim wypadku chciałem dodać do listy 3 np wartość "pusto" bądź "nieznaleziono". Nie wiem jak to rozgryźć, jakieś porady? Myślałem o wstawieniu if jak "i" dojdzie do maxa, ale co jeżeli akurat w ostatnim wierszu znajdzie te coś? Nie wiem nawet jak to w wujka google wpisać :(

     for (int j = 0; j < Lista1.Count; j++)
          {


              for (int i = 0; i < Lista2.Count-3; i++) //wyszukiwanie BPP kolejnych punktów
              {
                  if (Lista1[j] == Lista2[i])
                  {

                     Lista3.Add(Lista2[i + 3];
                     break;
                  }
                  // Coś tutaj zrób

              }
          }


1
else if (i + 1 == Lista2.Count-3) {
   Lista3.Add("Pusto");
}
1

Rozumiem, że jak coś się znajduje w obu listach, to pod tym samym indeksem? Jeśli nie to masz "błąd" w pierwszym if.

if (Lista1[j] == Lista2[i])

Nie potrzebujesz do tego pętli żeby wyciągnąć takie rzeczy.

var Lista3 = Lista1.Where(x=> Lista2.Any(y=>y == x));

lub (w zależności gdzie co ma się powtarzać

var Lista3 = Lista2.Where(x=> Lista1.Any(y=>y == x));

EDIT
To pierwsze nieaktualne. Teraz dopiero zobaczyłem, że tam jest j 🤦‍♂️

0

@AdamWox: Taak stosowałem to rozwiązanie dopóki się nie ogarnąłem, że nie działa jeżeli dana wartość się powtarza, a działając na współrzędnych niestety często się powtarzają :D I niestety nie są na tych samych indexach, tylko właśnie są różne rozlokowane dlatego jest podwójna pętla "i" oraz "j" która przeszukuje obydwie te listy. :)
Zastanawiam się tylko czyy można np przerwać wewnętrzną funkcję jak znajdzie L1[j] = L2[i] i wskoczyć do zewnętrznej żeby kontynuowała dalej L1[j+1] ? Na pewno skróciłoby to czas tych pętli bo nawet jak znajdzie na 1 pozycji w j=1 i i=1 to i tak przelatuje i do końca.

0

Tylko po co pętla skoro możesz zrobić to co ja ci napisałem? Jeśli Lista3 jest pusta to nie ma powtórek i nie potrzebujesz żadnej pętli, jedna linia, problem rozwiązany...

0

@AdamWox: No dobrze, tylko że interesuje mnie kolejność z listy 1, a dane z listy 2. W twoim wypadku po prostu przeleci wszystkie i znajdzie te które istnieją i je sobie pododaje do Listy 3 jak rozumiem? A muszę też mieć informację jak nie znajdzie danej wartości z Listy 1 w Liście 2 (a są takie przypadki), żeby wtedy dodać wartość "Puste" w danym indexie listy 1 [j], jest to istotne w dalszej części kodu, jeżeli jakaś wartość jest nieodnaleziona.

0

To znaczy, że musisz skorzystać z Insert() na liście, w którym podajesz wartość jaką chcesz dodać do listy oraz indeks, na którym ta wartość ma się znaleźć.

 for (int j = 0; j < Lista1.Count; j++)
            {

                for (int i = 0; i < Lista2.Count-3; i++) //wyszukiwanie BPP kolejnych punktów
                {
                    if (Lista1[j] == Lista2[i])
                    {
                       Lista3.Insert(i + 3, Lista2[i + 3]);
                       break;
                    }
                    else
                    {
                        Lista3.Insert(i+3, "PUSTE");
                    }
                }
            }

Problemem jest ArgumentOutOfRangeException jeśli Lista3 jest pusta, albo jak spróbujesz dodać element do indeksu większego niż ilość elementów w liście. Wydaje mi się, że zamiast List<T> najlepiej będzie ci operować na tablicy string[] wtedy może zainicjować rozmiar tej tablicy i OutOfRange nie wystąpi. Jest jeszcze inna opcja.

Zrób kopie List1 i zmieniaj wartości w kopii jeśli nie ma powtórzeń.

            List<string> lista1 = new List<string>()
            {
                "text",
                "extra",
                "super",
                "fajnie",
                "inny"
            };

            List<string> kopiaListy = lista1;

            for (int i = 0; i < lista1.Count; i++)
            {
                if (lista1[i] != "super")
                    kopiaListy[i] = "PUSTE";
            }

Oczywiście zrób sobie dwie pętle. Ogólny zamysł powinieneś zrozumieć.

REZULTAT
list_array.png

PS
Martwi mnie jeszcze kwestia tej pętli. Odejmujesz 3 Lista2.Count-3, później w indeksie dodajesz te 3 Lista2[i + 3]. Po co?

0

@AdamWox:
Co do "PS." Ech, mogłem to usunąć przed wstawieniem 😅
Generalnie to zdaje sobie sprawę że powinienem to robić na czymś innych niż listach, najlepiej pewnie sobie stworzyć klasę, ale na chwilę obecną jest to dla mnie prostsze i robię to tak.
Mam tak zrobione bo lista 2 składa się [Nr, X, Y, Cecha] i -3 jest żeby leciało po nr punktów. A +3 jest później bo do listy 3 cechę punktu z listy 2 na podstawie kolejności z listy 1 xD
Tylko może się właśnie zdarzyć że w liście 1 będzie jakiś punkt którego nie będzie w liście 2, i w tym wypadku własnie trzeba wstawić tą wartość "Puste".
Ale to z kopią listy mi się podoba, muszę to przetestować.
Generalnie zamysł aplikacji jest taki żeby jako efekt końcowy rysowało linie o różnych grubościach w DXF'ie. Lista 1 to punkty liń z DXF'a, Lista 2 to punkty z txt które posiadają określone cechy, tylko nie są poukładane liniami tylko w jakimś chaotycznym porządku. I żeby to narysować muszę przypisać liniom z DXF'a cechy punktów z txt. Po to jest właśnie lista 3. Zapewne robie to trochę na około ale na razie sobie postawiłem takie ambitne zadanie i z tym walczę po swojemu 😅
Coś w ten deseń:
screenshot-20210330101830.png

0

Prosta klasa z danymi i indeksem jako pole w klasie. Potem Intersect, Except i orderby.
Nie chce mi się rozpisywać z telefonu ale sprawdź te metody.

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