Sprawdzanie, czy tablica ciągów zawiera wartość, a jeśli tak, uzyskanie jej pozycji

163

Mam tę tablicę ciągów:

string[] stringArray = { "text1", "text2", "text3", "text4" };
string value = "text3";

Chciałbym ustalić, czy stringArrayzawiera value. Jeśli tak, chcę zlokalizować jego pozycję w tablicy.

Nie chcę używać pętli. Czy ktoś może zasugerować, jak mogę to zrobić?

MoShe
źródło

Odpowiedzi:

317

Możesz użyć metody Array.IndexOf :

string[] stringArray = { "text1", "text2", "text3", "text4" };
string value = "text3";
int pos = Array.IndexOf(stringArray, value);
if (pos > -1)
{
    // the array contains the string and the pos variable
    // will have its position in the array
}
Darin Dimitrov
źródło
1
... I używam foreach od miesięcy. Swoją drogą, czy to obliczeniowo szybsze niż odpowiedź BLUEPIXY? Czy wolniej?
Max von Hippel
2
Czy Array.IndexOfzależy Ci na kapitalizacji? Czy "text1" == "TEXT1"?
ZŁO
Array.IndexOfzwraca −1tylko wtedy, gdy indeks jest ograniczony do 0. Ta sprawa by się zepsuła, więc bądź świadomy! var a = Array.CreateInstance(typeof(int),new int[] { 2 }, new int[] { 1 }); a.SetValue(1, 1); Console.WriteLine(Array.IndexOf(a, 26)); // 0
benscabbia
Jest to przydatne, jeśli szukasz dokładnego dopasowania. Może to być jednak przydatne, jeśli nie obchodzi Cię przypadek: Jak dodać opcję bez uwzględniania wielkości liter do Array.IndexOf
Kyle Champion
72
var index = Array.FindIndex(stringArray, x => x == value)
BLUEPIXY
źródło
7
Powinna to być akceptowana odpowiedź, ponieważ pozwala ona na przekazanie lambda do bardziej skomplikowanych rzeczy, takich jak Array.FindIndex (array, x => x.StartsWith ("wstaw ciąg tutaj"))
reggaeguitar
1
Ale nie o to chodzi w pytaniu. Pytanie dotyczy tego, jak znaleźć znaną wartość z tablicy.
Karl Gjertsen
2
@KarlGjertsen Chcę zlokalizować jego pozycję w tablicy
BLUEPIXY
Jest to jednak bardzo przydatne, ponieważ możliwość zrobienia czegoś takiego jak x.ToUpper () była dla mnie całkiem korzystna.
mrshickadance
31

Możemy również skorzystać z Exists:

string[] array = { "cat", "dog", "perl" };

// Use Array.Exists in different ways.
bool a = Array.Exists(array, element => element == "perl");
bool c = Array.Exists(array, element => element.StartsWith("d"));
bool d = Array.Exists(array, element => element.StartsWith("x"));
Taran
źródło
1
Czysta i prosta odpowiedź
Aryan Firouzian
Jak mogę sprawdzić poszczególne wartości? Kiedy próbowałem sprawdzić tablicę znaków pod kątem znaku, otrzymałem wiadomość, charktórej nie można przekonwertować naSystem.Predicate<char>
Aaron Franke
13

EDYCJA: Nie zauważyłem, że również potrzebujesz tej pozycji. Nie można używać IndexOfbezpośrednio na wartości typu tablicowego, ponieważ jest on jawnie zaimplementowany. Możesz jednak użyć:

IList<string> arrayAsList = (IList<string>) stringArray;
int index = arrayAsList.IndexOf(value);
if (index != -1)
{
    ...
}

(Jest to podobne do wywołania Array.IndexOfzgodnie z odpowiedzią Darina - tylko alternatywne podejście. Nie jest dla mnie jasne, dlaczego jest zaimplementowane jawnie w tablicach, ale nieważne ...)IList<T>.IndexOf

Jon Skeet
źródło
jak znaleźć pozycję świata w tablicy za pomocą Contains?
MoShe
Czy istnieje możliwość sprawdzenia pozycji ciągu w tablicy ciągów A istnieje w innej tablicy ciągów B?
Murali Murugesan
@MuraliMurugesan: Nie jest jasne, o co pytasz - czy te dwie tablice mają jakieś wspólne elementy? Jeden konkretny przedmiot? (W tym drugim przypadku fakt, że znajduje się on również w tablicy, jest nieistotny.)
Jon Skeet
Próbowałem odpowiedzieć tutaj stackoverflow.com/a/22812525/1559213 . Udało mi się zwrócić true / false dla wiersza Html.CheckBox. Właściwie jest tablica miesięcy, a także model, który ma kilka miesięcy. Jeśli miesiąc modelowy jest obecny w tablicy miesięcy, musimy zwrócić wartość true. Dzięki za odpowiedź rakietową :)
Murali Murugesan
@MuraliMurugesan: Cóż, to brzmi jakif (months.Contains(model.Month))
Jon Skeet
5

Możesz użyć Array.IndexOf()- pamiętaj, że zwróci wartość -1, jeśli element nie został znaleziony i musisz sobie z tym poradzić.

int index = Array.IndexOf(stringArray, value);
Rozbite szkło
źródło
4

możesz spróbować w ten sposób ... możesz użyć Array.IndexOf (), jeśli chcesz również znać pozycję

       string [] arr = {"One","Two","Three"};
       var target = "One";
       var results = Array.FindAll(arr, s => s.Equals(target));
Enigma State
źródło
3

IMO najlepszym sposobem sprawdzenia, czy tablica zawiera podaną wartość, jest użycie System.Collections.Generic.IList<T>.Contains(T item)metody w następujący sposób:

((IList<string>)stringArray).Contains(value)

Kompletny przykład kodu:

string[] stringArray = { "text1", "text2", "text3", "text4" };
string value = "text3";
if (((IList<string>)stringArray).Contains(value)) Console.WriteLine("The array contains "+value);
else Console.WriteLine("The given string was not found in array.");

T[]tablice prywatnie implementują kilka metod List<T>, takich jak Count i Contains. Ponieważ jest to jawna (prywatna) implementacja, nie będzie można używać tych metod bez wcześniejszego rzutowania tablicy. To działa nie tylko w przypadku ciągów - możesz użyć tej sztuczki, aby sprawdzić, czy tablica dowolnego typu zawiera jakiś element, o ile klasa elementu implementuje IComparable.

Pamiętaj, że nie wszystkie IList<T>metody działają w ten sposób. Próba użycia IList<T>metody Add na tablicy nie powiedzie się.

pKami
źródło
2
Twoja odpowiedź jest w zasadzie taka sama jak Priyanka. Nie podaje indeksu elementu, o który prosił PO.
reggaeguitar
@reggaeguitar Zgadzam się tam z tobą!
Si8
To rozwiązanie, którego szukałem, chociaż nie do końca odpowiada na pytanie.
Auspex
1

Możesz tego spróbować, szuka indeksu zawierającego ten element i ustawia numer indeksu jako int, a następnie sprawdza, czy int jest większe niż -1, więc jeśli wynosi 0 lub więcej, to znaczy, że znalazł takie indeks - ponieważ tablice są oparte na 0.

string[] Selection = {"First", "Second", "Third", "Fourth"};
string Valid = "Third";    // You can change this to a Console.ReadLine() to 
    //use user input 
int temp = Array.IndexOf(Selection, Valid); // it gets the index of 'Valid', 
                // in our case it's "Third"
            if (temp > -1)
                Console.WriteLine("Valid selection");
            }
            else
            {
                Console.WriteLine("Not a valid selection");
            }
Mayer Spitzer
źródło
0
string x ="Hi ,World";
string y = x;
char[] whitespace = new char[]{ ' ',\t'};          
string[] fooArray = y.Split(whitespace);  // now you have an array of 3 strings
y = String.Join(" ", fooArray);
string[] target = { "Hi", "World", "VW_Slep" };

for (int i = 0; i < target.Length; i++)
{
    string v = target[i];
    string results = Array.Find(fooArray, element => element.StartsWith(v, StringComparison.Ordinal));
    //
    if (results != null)
    { MessageBox.Show(results); }

}
user5248404
źródło
0

Stworzyłem metodę rozszerzenia do ponownego użycia.

   public static bool InArray(this string str, string[] values)
    {
        if (Array.IndexOf(values, str) > -1)
            return true;

        return false;
    }

Jak to nazwać:

string[] stringArray = { "text1", "text2", "text3", "text4" };
string value = "text3";
if(value.InArray(stringArray))
{
  //do something
}
james31rock
źródło
Gdzie jest to position, o co prosi PO?
Si8
-3
string[] strArray = { "text1", "text2", "text3", "text4" };
string value = "text3";

if(Array.contains(strArray , value))
{
    // Do something if the value is available in Array.
}
Jaydeep Bhatt
źródło
Daje to błąd: „System.Array” nie zawiera definicji „zawiera”.
ePandit
-4

Najprostsza i krótsza metoda byłaby następująca.

string[] stringArray = { "text1", "text2", "text3", "text4" };
string value = "text3";

if(stringArray.Contains(value))
{
    // Do something if the value is available in Array.
}
Priyank Gajera
źródło
3
Pytanie dotyczyło znalezienia pozycji elementu w tablicy… Przy użyciu Containsmetody nie masz tych informacji
Bidou