Problem z zamiana elementów w tablicy

0

Witam,

banalny problem: chciałbym zamienić w tablicy string[] values wszystkie elementy o okreslonej wartości na elementy o innej wartości: mój kod:

            for (int i = 1; i < values.Length; i++)

            {
                if (values[i].Equals("KOT"))
                    values[i] = "PIES";
            }

Coś nie działa....

0
Programista_pocztkujacy napisał(a):

Coś nie działa....

Co konkretnie?

Dlaczego iterujesz od jedynki?

4

Używaj == do porównywania stringów, to nie Java.

0

Podaj przykładowe dane oraz aktualny i oczekiwany wynik. Z tego co podałeś i opisie "Coś nie działa" nie da się nic wywnioskować.

0

@Saalin, w C# metoda Equals dla stringa jest przesłonięta w taki sposób, że zwraca to, co pytający się spodziewa.
Problemem jest tu tylko to, że iteruje od 1, a nie od 0. Problemem mogą być też wielkości liter, choć z tego opisu to nie wynika.

0

Co Ci może nie działać?

screenshot-20190528132304.png

#Edit
Nawet przy Twojej 1 nic nie zmienia

screenshot-20190528132421.png

1

@Juhas: jeśli sądzisz, że sugerowałem, że to jest przyczyną błędu to Twoja nadinterpretacja. I istnieją ważne powody by nie używać Equals:

  1. Nikt nie pomyśli, że programujemy w Javie.
  2. Nie grozi nam NullReferenceException: string s1 = null; var res = s1.Equals(s2)
  3. Equals(string) to jedno z dostępnych przeciążeń. Inne to Equals(object). Używając Equals tracimy type-safety, bo nic nie stoi na przeszkodzie, żeby zrobić string s = ""; var res = s.Equals(1);, ale już "" == 1 nie ma racji bytu.
0

Jak już rozmawiamy o porównaniu przez Equals, to porównanie przez == wcale nie jest wiele lepsze. W szczególności dokumentacja MSDN https://docs.microsoft.com/en-us/dotnet/csharp/how-to/compare-strings mówi:

Avoid using the == and != operators when you test for equality. The String.CompareTo instance methods always perform an ordinal case-sensitive comparison. They are primarily suited for ordering strings alphabetically.
2

@Afish w C# do podstawowego porównania stringów stosuje się == i tyle. Jeżeli potrzebuje się bardziej wyrafinowanego porównania to stosuje się inne metody. Generalnie nie widziałem, żeby ktoś jawnie Equals używał gdziekolwiek.

0

Operator == czy statyczna albo instancyjna meda Equals to jest to samo . Operator == wywołuje statyczną metodę Equals .
Porównywanie polega na tym :

  1. najpierw sprawdzane są referencje czy nie porównujemy tego samego łańcucha . Jeśli to jest ta sama referencja to wynik jest true - koniec sprawdzania
  2. drugie sprawdzenie jeśli któryś z łańcuchów ma referencję null to wynik false - koniec sprawdzania
    3 trzecie sprawdzenie czy łańcuchy mają tę samą długość . Jeśli nie to false - koniec sprawdzania
    Jeśli wszystkie warunki mają wartość false to wywoływana jest metoda
[SecuritySafeCritical]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
private unsafe static bool EqualsHelper(string strA, string strB)
{
	int num = strA.Length;
	fixed (char* ptr = &strA.m_firstChar)
	{
		fixed (char* ptr3 = &strB.m_firstChar)
		{
			char* ptr2 = ptr;
			char* ptr4 = ptr3;
			while (num >= 12)
			{
				if (*(long*)ptr2 != *(long*)ptr4)
				{
					return false;
				}
				if (*(long*)(ptr2 + 4) != *(long*)(ptr4 + 4))
				{
					return false;
				}
				if (*(long*)(ptr2 + 8) != *(long*)(ptr4 + 8))
				{
					return false;
				}
				ptr2 += 12;
				ptr4 += 12;
				num -= 12;
			}
			while (num > 0 && *(int*)ptr2 == *(int*)ptr4)
			{
				ptr2 += 2;
				ptr4 += 2;
				num -= 2;
			}
			return num <= 0;
		}
	}
}
1
Sarrus napisał(a):

Generalnie nie widziałem, żeby ktoś jawnie Equals używał gdziekolwiek.

Ja widziałem.
To zjawisko dotyczy ludzi z pewnego zamorskiego kraju, którzy zawsze pisali w Javie, a zostali na siłę przekwalifikowani na C#.

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