Skracanie kodu

0

Witam mam pewne pytanko ponieważ siedzę przy c# od niedawna i nie znam jeszcze wielu funkcij i dlatego mam pytanko czy da sie skrocic fragment kodu ktory wklejam ponizej? A jeżeli się da a wydaje mi sie ze sie da to jak to zrobic ?

                if (b.Location.X >= 0 && b.Location.X <= 100 && b.Location.Y >= Convert.ToInt32(position[0]) && b.Location.Y <= Convert.ToInt32(position[1])) // 0 to 135
                {
                    b.Location = new Point(50 - (b.Width / 2), 68 - (b.Height / 2));
                }
                else if (b.Location.X >= 0 && b.Location.X <= 100 && b.Location.Y >= Convert.ToInt32(position[1]) && b.Location.Y <= Convert.ToInt32(position[2])) // 135 to 270
                {
                    b.Location = new Point(50 - (b.Width / 2), 204 - (b.Height / 2));
                }
                else if (b.Location.X >= 0 && b.Location.X <= 100 && b.Location.Y >= Convert.ToInt32(position[2]) && b.Location.Y <= Convert.ToInt32(position[3])) // 270 to 405
                {
                    b.Location = new Point(50 - (b.Width / 2), 340 - (b.Height / 2));
                }
                else if (b.Location.X >= 0 && b.Location.X <= 100 && b.Location.Y >= Convert.ToInt32(position[3]) && b.Location.Y <= Convert.ToInt32(position[4])) // 405 to 540
                {
                    b.Location = new Point(50 - (b.Width / 2), 476 - (b.Height / 2));
                }
                else if (b.Location.X >= 0 && b.Location.X <= 100 && b.Location.Y >= Convert.ToInt32(position[4]) && b.Location.Y <= Convert.ToInt32(position[5])) // 540 to 675
                {
                    b.Location = new Point(50 - (b.Width / 2), 612 - (b.Height / 2));
                }
                else if (b.Location.X >= 0 && b.Location.X <= 100 && b.Location.Y >= Convert.ToInt32(position[5]) && b.Location.Y <= Convert.ToInt32(position[6])) // 675 to 810
                {
                    b.Location = new Point(50 - (b.Width / 2), 748 - (b.Height / 2));
                }
1

Tak na szybko:
Początek warunku jest identyczny wszędzie więc można go wyciągnąć.
Potem wrzucić w pętlę ze zmienną przechodzącą od 0 do 5. W ciele pętli pozostałe warunki i wyjście przy którymkolwiek spełnionym.

if (b.Location.X >= 0 && b.Location.X <= 100)
{
  for (int i = 0; i <= 5; i++)
  {
    if(b.Location.Y >= Convert.ToInt32(position[i]) && b.Location.Y <= Convert.ToInt32(position[i + 1]))
    {
      b.Location = new Point(50 - (b.Width / 2), (68 + (136 * i)) - (b.Height / 2));
      break;
    }
  }
1
var cos = new int[] { 68, 204, 340, 476, 612, 748 };
            if (b.Location.X >= 0 && b.Location.X <= 100)
            {
                for (int i = 0; i <= 5; i++)
                    if (b.Location.Y >= Convert.ToInt32(position[i]) && b.Location.Y <= Convert.ToInt32(position[i + 1]))
                    {
                        b.Location = new Point(50 - (b.Width / 2), cos[i] - (b.Height / 2));
                        break;
                    }
            }

ech, prawie identyczny kod :p. Chociaż te magiczne numerki wypadało by stałymi zastąpić

2

Kod powinien być krótki w tym sensie że nie powinien się niepotrzebnie powtarzać ale powinien również być prosty w czytaniu .Możesz np. używać nawiasów w wyrażeniach nawet jeśli nie są potrzebne. Łatwiej będzie ci się potem czytało kod.
Co z tego że ktoś potrafi 5 linijek kodu zapisać w jednej jak potem on sam albo ktoś inny będzie tracił czas na odszyfrowywanie kodu. Często to jak zapiszemy kod nie ma żadnego wpływu na wynik końcowy ani na wydajność programu.

1

wydaje się że chcesz po prostu wyśrodkować element w komórkach po 135 pikseli, kod powinien wyglądać mniej więcej tak:

int cellHeight = 135;

if (b.Location.X >= 0 && b.Location.X <= 100)
{
    var yAligned = (b.Location.Y / cellHeight) * cellHeight;
    b.Location = new Point(50 - b.Width / 2, yAligned + cellHeight / 2 + b.Height / 2);
}

podejrzewam że to samo chcesz zrobić z b.Location.X

0
obscurity napisał(a):

wydaje się że chcesz po prostu wyśrodkować element w komórkach po 135 pikseli, kod powinien wyglądać mniej więcej tak:

int cellHeight = 135;

if (b.Location.X >= 0 && b.Location.X <= 100)
{
    var yAligned = (b.Location.Y / cellHeight) * cellHeight;
    b.Location = new Point(50 - b.Width / 2, yAligned + cellHeight / 2 + b.Height / 2);
}

podejrzewam że to samo chcesz zrobić z b.Location.X

Bardzo dziękuje i z góry chciał bym tez podziękować innym za bardzo pomoce porady i wlasnie tutaj nawiazujac chcialem sie spytac czy dalo by sie rowniez skrocic to b.Location.X bo ja wykorzystuje te sktory to wychodzi cos takiego

            if (b.Location.X >= 0 && b.Location.X <= 100)
            {
                for (int i = 0; i <= 500; i++)
                {
                    if (b.Location.Y >= Convert.ToInt32(position[i]) && b.Location.Y <= Convert.ToInt32(position[i + 1]))
                    {
                        b.Location = new Point(50 - (b.Width / 2), (68 + (136 * i)) - (b.Height / 2));
                        break;
                    }
                }
            }

            if (b.Location.X >= 100 && b.Location.X <= 200)
            {
                for (int i = 0; i <= 500; i++)
                {
                    if (b.Location.Y >= Convert.ToInt32(position[i]) && b.Location.Y <= Convert.ToInt32(position[i + 1]))
                    {
                        b.Location = new Point(150 - (b.Width / 2), (68 + (136 * i)) - (b.Height / 2));
                        break;
                    }
                }
            }

            if (b.Location.X >= 200 && b.Location.X <= 300)
            {
                for (int i = 0; i <= 500; i++)
                {
                    if (b.Location.Y >= Convert.ToInt32(position[i]) && b.Location.Y <= Convert.ToInt32(position[i + 1]))
                    {
                        b.Location = new Point(250 - (b.Width / 2), (68 + (136 * i)) - (b.Height / 2));
                        break;
                    }
                }
            }

            if (b.Location.X >= 300 && b.Location.X <= 400)
            {
                for (int i = 0; i <= 500; i++)
                {
                    if (b.Location.Y >= Convert.ToInt32(position[i]) && b.Location.Y <= Convert.ToInt32(position[i + 1]))
                    {
                        b.Location = new Point(350 - (b.Width / 2), (68 + (136 * i)) - (b.Height / 2));
                        break;
                    }
                }
            }

            if (b.Location.X >= 400 && b.Location.X <= 500)
            {
                for (int i = 0; i <= 500; i++)
                {
                    if (b.Location.Y >= Convert.ToInt32(position[i]) && b.Location.Y <= Convert.ToInt32(position[i + 1]))
                    {
                        b.Location = new Point(450 - (b.Width / 2), (68 + (136 * i)) - (b.Height / 2));
                        break;
                    }
                }
            }

            if (b.Location.X >= 500 && b.Location.X <= 600)
            {
                for (int i = 0; i <= 500; i++)
                {
                    if (b.Location.Y >= Convert.ToInt32(position[i]) && b.Location.Y <= Convert.ToInt32(position[i + 1]))
                    {
                        b.Location = new Point(550 - (b.Width / 2), (68 + (136 * i)) - (b.Height / 2));
                        break;
                    }
                }
            }
0

Przeczuwam możliwość skrócenia i uczynienia kodu bardzie czytelnym, gdyby tablica position była tablicą par liczb X,Y (???), lub czwórek.(X,Y, coś, coś)
Nie podajesz deklaracji ani komentarza co w niej jest

0

Są w niej zapisane przedziały od do gdzie przycisk ma się wyśrodkować

Plik position fragment

0
135
270
405
540
675
810
945
1080
1215
1350
1485
1620
1755
1890
2025
2160
2295
2430
2565
2700
2835
2970
3105
3240
3375
0
int cellHeight = 135;
int cellWidth = 100;

var yAligned = (b.Location.Y / cellHeight) * cellHeight;
var xAligned = (b.Location.X / cellWidth) * cellWidth;
b.Location = new Point(xAligned + cellWidth / 2 + b.Width / 2, yAligned + cellHeight / 2 + b.Height / 2);
0
obscurity napisał(a):
int cellHeight = 135;
int cellWidth = 100;

var yAligned = (b.Location.Y / cellHeight) * cellHeight;
var xAligned = (b.Location.X / cellWidth) * cellWidth;
b.Location = new Point(xAligned + cellWidth / 2 + b.Width / 2, yAligned + cellHeight / 2 + b.Height / 2);

Niestety ten kod jeżeli chodzi o mnie nie działa ponieważ jak przesuwam element (przycisk) to nie jest on na środku tylko poza prostokątem

0

Dobrze po lekkiej mojej modyfikacji kodu @obscurity wyszedł mi kod który według mnie jest już na sensownym poziomie w porównaniu do tego co było na początku bardzo dziękuje za wszelka pomoc wszystkich którzy pisali porady i wskazówki jestem wam za to bardzo wdzięczny chociaż wiem ze to dopiero początek mojej długiej przygody z c# mam nadzieje ze kiedyś również będę mógł dawać porady początkującym tak jak wy dawaliście mi jeszcze raz dziękuje :)

Poniżej wklejam modyfikacje która wykonałem

            int cellHeight = 135;
            int cellWidth = 100;

            var yAligned = (b.Location.Y / cellHeight) * cellHeight;
            var xAligned = (b.Location.X / cellWidth) * cellWidth;
            b.Location = new Point((b.Width / 2) - 74 + xAligned + cellWidth / 2, yAligned + cellHeight / 2 + b.Height / 2 - 21);
0

miało być oczywiście "- b.Width / 2" i "- b.Height / 2", ale można też powpisywać magiczne liczby tak żeby się zgadzało ;)

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