Chcę sprawdzić, czy ciąg zawiera więcej niż jeden znak w ciągu znaków? Jeśli mam ciąg 12121.23.2, więc chcę sprawdzić, czy zawiera więcej niż jeden. w ciągu znaków.Jak rozpoznać, czy ciąg zawiera więcej niż jedno wystąpienie określonego znaku?
Odpowiedz
Możesz porównać IndexOf
do LastIndexOf
aby sprawdzić, czy jest więcej niż jeden specyficzny charakter w string
bez wyraźnej liczenia:
var s = "12121.23.2";
var ch = '.';
if (s.IndexOf(ch) != s.LastIndexOf(ch)) {
...
}
Można łatwo policzyć liczbę wystąpień o charakterze z LINQ:
string foo = "12121.23.2";
foo.Count(c => c == '.');
Boolean MoreThanOne(String str, Char c)
{
return str.Count(x => x==c) > 1;
}
ciąg znaków i znak nie mogą mieć takiego samego znaku w nich – Arka
Tak i nie używam go ani w mojej odpowiedzi, proszę zrozumieć, co robię, jeśli nie rozumiesz, spróbuj uruchomić i przekonaj się, czy to działa, czy nie. –
Jeżeli kwestie wydajności, napisać go samodzielnie:
public static bool ContainsDuplicateCharacter(this string s, char c)
{
bool seenFirst = false;
for (int i = 0; i < s.Length; i++)
{
if (s[i] != c)
continue;
if (seenFirst)
return true;
seenFirst = true;
}
return false;
}
W ten sposób przechodzisz tylko jedną treść ciągu, a wyskakujesz jak najwcześniej. W najgorszym przypadku odwiedzasz wszystkie postacie tylko raz. W odpowiedzi @ dasblinkenlight odwiedzasz wszystkie postacie dwa razy, aw odpowiedzi @ mensi musisz liczyć wszystkie wystąpienia, nawet jeśli masz dwa, możesz zatrzymać obliczenia. Ponadto, przy użyciu metody rozszerzania Count
wykorzystuje się Enumerable<char>
, który będzie działał wolniej niż bezpośredni dostęp do znaków w określonych indeksach.
Następnie można napisać:
string s = "12121.23.2";
Debug.Assert(s.ContainsDuplicateCharacter('.'));
Debug.Assert(s.ContainsDuplicateCharacter('1'));
Debug.Assert(s.ContainsDuplicateCharacter('2'));
Debug.Assert(!s.ContainsDuplicateCharacter('3'));
Debug.Assert(!s.ContainsDuplicateCharacter('Z'));
Ja też myślę, że to ładniejszy mieć funkcję, która wyjaśnia dokładnie, co próbujesz osiągnąć. Można jednak owijać dowolne inne odpowiedzi w takiej funkcji.
Odpowiedź dasblinkenlight jest prawie poprawna. Musisz również sprawdzić, czy łańcuch faktycznie zawiera "." w tym. Ponieważ zarówno IndexOf(), jak i LastIndexOf() zwrócą -1 w przypadku, gdy nie ma "." char w ciągu znaków.
Tutaj jest korygowany przykład:
var s = "12121.23.2";
var ch = '.';
if ((s.IndexOf(ch) >= 0) && (s.IndexOf(ch) != s.LastIndexOf(ch))) {
...
}
EDIT: źle, nie ma potrzeby, aby sprawdzić, czy rzeczywiście zawiera ciąg znaków ''.
- 1. Śledź więcej niż jedno łącze z vimperatorem
- 2. sprawdzić, czy ciąg zawiera numer większy niż
- 3. Jak wykonać więcej niż jedno polecenie maven w pliku bat?
- 4. Jak napisać makro Clojure, aby utworzyć więcej niż jedno wyrażenie?
- 5. Jak dopasować 0 lub więcej niż 1 wystąpienie spacje
- 6. Jak mogę odtwarzać/wstrzymać więcej niż jedno wideo przez mouseover
- 7. Zamień jedno wystąpienie na regexp
- 8. Jak rozpoznać wystąpienie System.Type reprezentujące SZ-Array?
- 9. Jak włączyć tylko jedno wystąpienie mojej aplikacji
- 10. EF Core 1.0 - Include() generuje więcej niż jedno zapytanie
- 11. MonitoredTrainingSession zapisuje więcej niż jedno zdarzenie metagraph na jeden bieg
- 12. Perl wyszukuje i zastępuje ostatnie wystąpienie znaku
- 13. XSLT Pierwsze wystąpienie określonego znacznika
- 14. Sprawdź, czy ciąg zawiera znaki spoza cyfr
- 15. Jak zasymulować więcej niż jedno żądanie (na przykład 4000 lub więcej) na jednej stronie, aby przetestować wydajność?
- 16. Sprawdź, czy ciąg zawiera podłańcuch
- 17. Błąd aplikacji sieci Web: Sekwencja zawiera więcej niż jeden element
- 18. Wykryj, czy ciąg zawiera tabelę
- 19. Sprawdź, czy ciąg zawiera inny ciąg
- 20. Jak ustalić, czy ciąg zawiera konkretny podłańcuch
- 21. Sprawdzanie, czy ciąg zawiera „http: //”
- 22. Jak # zdefiniować ciąg znaków bez znaku *?
- 23. Sprawdź, czy ciąg zawiera datę, czy nie.
- 24. jak sprawdzić, czy iteracja dopuszcza więcej niż jeden przebieg?
- 25. Wyrażenie regularne pasujące do tekstu zawierającego n lub więcej określonego znaku
- 26. Jak sprawdzić, czy lista zawiera obiekt określonego typu? C#
- 27. Jak określić appconfig zawiera określonego klucza
- 28. Jak zamienić tylko pierwsze wystąpienie znaku w CString?
- 29. Jak odszedłeś dołączyć do Linq, jeśli w złączeniu jest więcej niż jedno pole?
- 30. Jak uzyskać długi ciąg bez znaku?
Nie powiedzie się, jeśli znak nie jest obecny, ponieważ oba indeksy mają wartość -1. –
@DrewNoakes Dlaczego? Jeśli znak nie występuje wcale, obie funkcje zwracają '-1', więc'! = 'Zwraca wartość 'false'. Potrzebujesz dwóch lub więcej znaków: zero lub jeden znak, pierwszy i ostatni indeks są takie same (rzeczywisty indeks lub '-1'). – dasblinkenlight
Ugh, tak, masz rację :) Mój błąd. –