Jak mam wykonać funkcję, która zwróci true
, jeśli ciąg zawiera dowolny element tablicy?Porównywanie ciągów i tablic C#
coś takiego:
string str = "hi how are you";
string[] words = {"hi", "hey", "hello"};
wróci true
.
Jak mam wykonać funkcję, która zwróci true
, jeśli ciąg zawiera dowolny element tablicy?Porównywanie ciągów i tablic C#
coś takiego:
string str = "hi how are you";
string[] words = {"hi", "hey", "hello"};
wróci true
.
Można to zrobić tak:
var array = new[] {"quick", "brown", "fox"};
var myString = "I love foxes.";
if (array.Any(s => myStr.IndexOf(s) >= 0)) {
// One of the elements is there
}
Takie podejście czyni nie wymagać, że element będzie pełny słowo (czyli powyżej fragment wróci true
, chociaż słowo "fox"
nie występuje tam jako pojedyncze słowo).
Lub jeśli nie przeszkadza tracąc łagodny ilość efektywności więcej readabili ty: 'if (array.Any (s => myStr.Contains (s)) {" zrobi to również, jak sądzę. – Jeff
Dzięki, to jest dokładnie to, czego szukałem! Dziękuję również za naprawienie złego formatowania Mr_Green :) Czy łatwo jest zmienić to tak, aby nie było w nim mowy? – user1852287
@ user1852287 Tak - użyj 'myStr.IndexOf (s, StringComparison.OrdinalIgnoreCase)', aby uczynić go niewrażliwym na wielkość liter. – dasblinkenlight
Możesz podzielić ciąg znaków i użyć Enumerable.Intersect
. To będzie o wiele bardziej efektywne dla długich ciągów niż Any
+ IndexOf
:
var any = words.Intersect(str.Split()).Any();
@ user18522877 Zakłada to, że szukasz całych słów, a nie podciągów, więc w przykładzie takim jak dasblinkenlight zwróci 'false' - to może być to, czego szukasz, ale jeśli tak, to prawdopodobnie powinieneś zmienić swoje pytanie . – Jeff
Nie potrzeba pętli, tutaj jest szybsza metoda:
string [] arr = {"One","Two","Three"};
var target = "One";
var results = Array.FindAll(arr, s => s.Equals(target));
Jak to jest szybciej? Czy nadal pętle ... –
myślę, że trzeba by sprawdzić, czy ciąg zawiera w drugi ciąg (nie wiem o wydajności)
foreach(string strLine in words)
{
if(strLine.Contains(str)) //or str.Contains(strLine)
{
return true;
}
}
//return false;
'foreach' +' String.IndexOf' – zerkms