Porównanie wartości w kolumnie

0

Witam
Mam kolumnę którą sortuję rosnąco i dostaję taki wynik:
r1
r1
r2
r2
r3
r3
następnie chciałbym aby w drugiej kolumnie za pomocą pętli for nadało taką numerację:
1
1
2
2
3
3

Stworzyłem taki kod:

int w = 1;
dataGridView2.Rows[0].Cells[4].Value = w;

        for (int i = 1; i < dataGridView2.Rows.Count; i++)
        {              

            if (dataGridView2.Rows[i].Cells[8].Value.ToString() == dataGridView2.Rows[i -1].Cells[8].Value.ToString() )
            {
                dataGridView2.Rows[i].Cells[4].Value = dataGridView2.Rows[i - 1].Cells[4].Value;
            }
          
            else
            {
                dataGridView2.Rows[i].Cells[4].Value = dataGridView2.Rows[i - 1].Cells[4].Value  = w++  ;
            }```
Efekt:
1
1
1
2
2
3
Jak w pętli for zacznę o int i = 0  to krzyczy że poza zakresem.
Co robię źle?
Pozdrawiam
Tomko
0

@Tomko: Strasznie ciężko czyta się taki kod. Wydziel wartości do jakiś zmiennych, pozbądź się magic numbers zastępując je stałymi. Rozumiem, że chodzi o to, żeby pozbyć się tego "r" z początku wartości?

dla każdego wiersza : i
  wartość komórki[i,4] = substring( wartość komórki[i,8], 1)
koniec

Spróbuj najpierw zrobić to zadanie w Excelu i jak się uda to spróbuj przenieść do kodu.

0

@maszrum: Dziękuję za odpowiedź!!
Niestety nie chodziło mi o substring bo r1,r2,r3 jest tylko przykładem. W rzeczywistości w porównywanej komórce jest więcej znaków np:
452246
453346
452144
452144
itd.
Pozdrawiam
Tomko

0
Tomko napisał(a):

452246
453346
452144
452144

A jakich wartości oczekujesz dla takich danych? Podaj więcej przykładów albo lepiej opisz czego oczekujesz w tej drugiej kolumnie bo kompletnie nie mam pojęcia o co może chodzić.

Edit: czy chodzi o takie coś: numeracja wierszy po kolei, ale jeśli wartości powtarzają się, to nie twórz dla nich nowych numerów?

0

@maszrum: Już objaśniam
Tych wartości jest wiecej nieraz jest jedno wystapienie a w niektórych wypadkach może byc ich nawet cztery.
Chodzi o to aby zaczynając od jeden ponumerować je rosnąco z tym że przy duplikujacej wartosci pozostawić poprzedni numer.
i tak:

452246 1
453346 1
452144 2
452144 2
452144 2
452148 3
itd..
Pozdrawiam
Tomko

0

Myślę, że problem jest w tej linii:

  dataGridView2.Rows[i].Cells[4].Value = dataGridView2.Rows[i - 1].Cells[4].Value  = w++  ;

w++ najpierw zwraca swoją aktualną wartość a potem inkrementuje. Będzie działać jeśli zrobisz ++w. Wychodzi właśnie to o czym wcześniej pisałem: bałagan w kodzie. Jeśli zrobiłbyś to w ten sposób:

  w++;
  dataGridView2.Rows[i].Cells[4].Value = dataGridView2.Rows[i - 1].Cells[4].Value  = w;

to nie byłoby problemu.

0

@maszrum: Dzięki za odpowiedź. Masz rację co do bałaganu.
Niestety to już próbowałem wynik jest taki przy pętli int i = 1
452246 1
453346 2 <= ! tu powinno być jeden
452144 2
452144 2
452144 3
452148 3

Jak w pętli for zacznę int i = 0 to krzyczy że poza zakresem.
Pozdrawiam
Tomko

0

@Tomko: Ale dla danych 452246, 453346, 452144, 452144, 452144, 452148 powinno być 1, 2, 3, 3, 4, 5. Przecież [0] i [1] różnią się, [4] i [5] też!

Edukacyjnie poprawiłem ten kod, zobacz czy wygląda lepiej i napisz czy działa, bo pisałem go tu w polu na forum.

private const int ValueColumn = 8;
private const int UniqueNumberColumn = 4;
private DataGridViewCell GetCell(int row, int column) =>
        dataGridView2.Rows[row].Cells[column];
var uniqueCellCounter = 1;
GetCell(0, UniqueNumberColumn).Value = uniqueCellCounter;

for (var i = 1; i < dataGridView2.Rows.Count; i++)
{           
	var previousValueCell = GetCell(i - 1, ValueColumn);
    var currentValueCell = GetCell(i, ValueColumn);

	var previousUniqueNumberCell = GetCell(i - 1, UniqueNumberColumn);
	var currentUniqueNumberCell = GetCell(i, UniqueNumberColumn);

    var isValueSameAsPrevious = currentValueCell.Value.ToString() == previousValueCell.Value.ToString();
	
    if (isValueSameAsPrevious)
    {
	    currentUniqueNumberCell.Value = previousUniqueNumberCell.Value;
    }
    else
    {
	    uniqueCellCounter++;
		currentUniqueNumberCell.Value = uniqueCellCounter;
    }
}
0

@maszrum: Wielkie dzięki za pomoc!!! Działa tak jak chciałem.
Rozumiem że moje podejście nie miało prawa się powieść?
Pozdrawiam
Tomko

0
Tomko napisał(a):

Rozumiem że moje podejście nie miało prawa się powieść?

Ale to jest to samo co w pierwszym poście, tylko z ++w zamiast w++ zapisane w bardziej czytelnej formie. Nie wiem czemu ci wcześniej nie działało, może źle sprawdzałeś.

0

@maszrum: Ok jak trochę "odpocznę" to podejdę jeszcze raz do tematu.
Jeszcze raz dzięki!
pozdrawiam
tomko

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.