Potrzebuję wyszukiwania ciąg w tablicy ciągów. Nie chcę używać żadnego do zapętlenia w nimJak wyszukiwać ciąg w tablicy ciągów
string [] arr = {"One","Two","Three"};
string var = "One"
Muszę sprawdzić, czy zmienna var występuje w arr.
Potrzebuję wyszukiwania ciąg w tablicy ciągów. Nie chcę używać żadnego do zapętlenia w nimJak wyszukiwać ciąg w tablicy ciągów
string [] arr = {"One","Two","Three"};
string var = "One"
Muszę sprawdzić, czy zmienna var występuje w arr.
Każda wspomniana wcześniej metoda polega na zapętleniu wewnętrznym lub zewnętrznym, dlatego nie jest ważne jak ją wdrożyć.Oto kolejny przykład znalezienie wszystkich referencji docelowej ciąg
string [] arr = {"One","Two","Three"};
var target = "One";
var results = Array.FindAll(arr, s => s.Equals(target));
Cóż, coś będzie musiało wyglądać, a pętla jest bardziej efektywna niż rekursja (ponieważ rekursja końca końca nie jest w pełni zaimplementowana) ... więc jeśli po prostu nie chcesz się zapętlać, to albo od:
bool has = arr.Contains(var); // .NET 3.5
lub
bool has = Array.IndexOf(arr, var) >= 0;
Dla informacji: unikać nazw takich jak var - to słowo kluczowe w C# 3.0.
Czy to musi być ciąg []? Lista <String> dałaby ci to, czego potrzebujesz.
List<String> testing = new List<String>();
testing.Add("One");
testing.Add("Two");
testing.Add("Three");
testing.Add("Mouse");
bool inList = testing.Contains("Mouse");
Każda klasa implementująca IList ma metodę Contains(Object value). Podobnie jak System.Array.
Należy zauważyć, że w przypadku ogólnych pojemników 2.0 znajduje się on na karcie ICollection
bool exists = arr.Contains("One");
Jeśli tablica jest posortowana, można użyć BinarySearch. Jest to operacja O (log n), więc jest szybsza jako pętla. Jeśli musisz zastosować wiele wyszukiwań, a prędkość jest problemem, możesz go posortować (lub skopiować) przed użyciem.
Przy pierwszym ujęciu mogłem wymyślić coś takiego (ale jest to pseudo kod i zakładając, że nie można używać żadnych wbudowanych bibliotek programu .NET). Może wymagać odrobiny poprawiania i ponownego przemyślenia, ale czy powinien być wystarczająco dobry, by zacząć od nowa?
int findString(String var, String[] stringArray, int currentIndex, int stringMaxIndex)
{
if currentIndex > stringMaxIndex
return (-stringMaxIndex-1);
else if var==arr[currentIndex] //or use any string comparison op or function
return 0;
else
return findString(var, stringArray, currentIndex++, stringMaxIndex) + 1 ;
}
//calling code
int index = findString(var, arr, 0, getMaxIndex(arr));
if index == -1 printOnScreen("Not found");
else printOnScreen("Found on index: " + index);
W języku C#, jeśli można użyć ArrayList, można użyć zawiera metodę, która zwraca wartość logiczną:
if MyArrayList.Contains("One")
w .NET 2.0, zawsze wolą List
Dlaczego zakaz „nie chcę użyć dowolnej pętli” ? To najbardziej oczywiste rozwiązanie. Gdy masz szansę być oczywistym, weź to!
Pamiętaj, że połączenia takie jak arr.Contains(...)
nadal będą przetwarzane w pętlę , to po prostu nie będziesz ty, która napisała pętlę.
Czy brałeś pod uwagę alternatywną reprezentację, która jest bardziej podatna na wyszukiwanie?
arr
, możesz użyć wyszukiwania binarnego (które wymagałoby rekurencji lub pętli, ale nie tak często, jak proste wyszukiwanie liniowe).myślę, że lepiej jest użyć Array.Exists niż Array.FindAll.
To całkiem proste. Zawsze używam tego kodu, aby wyszukać ciąg znaków z tablicy ciągów
string[] stringArray = { "text1", "text2", "text3", "text4" };
string value = "text3";
int pos = Array.IndexOf(stringArray, value);
if (pos > -1)
{
return true;
}
else
{
return false;
}
Można wykorzystać Find metodę typu Array. Od .NET 3.5 i wyższych.
public static T Find<T>(
T[] array,
Predicate<T> match
)
Oto przykłady:
// we search an array of strings for a name containing the letter “a”:
static void Main()
{
string[] names = { "Rodney", "Jack", "Jill" };
string match = Array.Find (names, ContainsA);
Console.WriteLine (match); // Jack
}
static bool ContainsA (string name) { return name.Contains ("a"); }
Tutaj jest ten sam kod, skrócone z anonimową sposób:
string[] names = { "Rodney", "Jack", "Jill" };
string match = Array.Find (names, delegate (string name)
{ return name.Contains ("a"); }); // Jack
Wyrażenie lambda skraca się dalej:
string[] names = { "Rodney", "Jack", "Jill" };
string match = Array.Find (names, n => n.Contains ("a")); // Jack
Możesz sprawdzić, czy element istnieje encji przez
arr.Any(x => x == "One")
Array.Exists() jest lepsze, myślę. –