2008-11-05 10 views

Odpowiedz

54

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)); 
+2

Array.Exists() jest lepsze, myślę. –

104

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.

21

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"); 
4

Każda klasa implementująca IList ma metodę Contains(Object value). Podobnie jak System.Array.

+0

Należy zauważyć, że w przypadku ogólnych pojemników 2.0 znajduje się on na karcie ICollection ; sam pomysł, ale –

4

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.

1

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); 
1

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") 
+4

w .NET 2.0, zawsze wolą List ponad ArrayList. Lista może zrobić to samo, ale z lepszym bezpieczeństwem typu i większą elastycznością. –

3

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?

  • Dobra implementacja zestawu byłaby dobra. (HashSet, TreeSet lub lokalny odpowiednik).
  • Jeśli masz pewność, że sortowane jest arr, możesz użyć wyszukiwania binarnego (które wymagałoby rekurencji lub pętli, ale nie tak często, jak proste wyszukiwanie liniowe).
8

myślę, że lepiej jest użyć Array.Exists niż Array.FindAll.

7

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; 
} 
2

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 
1

Możesz sprawdzić, czy element istnieje encji przez

arr.Any(x => x == "One") 
Powiązane problemy