Перевірка, чи містить рядовий масив значення, і якщо так, отримання його позиції


163

У мене є такий рядковий рядок:

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

Я хотів би визначити, чи stringArrayмістить value. Якщо так, я хочу знайти його позицію в масиві.

Я не хочу використовувати петлі. Хтось може підказати, як я можу це зробити?

Відповіді:


317

Ви можете використовувати метод 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
}

1
... І я використовую foreach місяцями. BTW це обчислювально швидше, ніж відповідь BLUEPIXY? Або повільніше?
Макс фон Гіппель

2
Дбає Array.IndexOfпро капіталізацію? Чи "text1" == "TEXT1"?
ЗЛИВ

Array.IndexOfповертається −1лише в тому випадку, якщо індекс обмежений 0. Ця справа порушиться, тому будьте в курсі! var a = Array.CreateInstance(typeof(int),new int[] { 2 }, new int[] { 1 }); a.SetValue(1, 1); Console.WriteLine(Array.IndexOf(a, 26)); // 0
benscabbia

Це корисно, якщо ви шукаєте точну відповідність. Однак це може бути корисним, якщо ви не переймаєтесь справою: Як додати Array.IndexOf
Kyle Champion

72
var index = Array.FindIndex(stringArray, x => x == value)

7
Це має бути прийнятою відповіддю, оскільки це дозволяє перейти в лямбда, щоб робити більш складні речі, такі як Array.FindIndex (масив, x => x.StartsWith ("тут вставити рядок"))
reggaeguitar

1
Але це не те, про що задається питання. Питання задає питання, як знайти відоме значення з масиву.
Karl Gjertsen

2
@KarlGjertsen Я хочу знайти своє місце в масиві
BLUEPIXY

Це дуже корисно, хоча можливість зробити щось на кшталт x.ToUpper () було для мене досить корисним.
mrshickadance

31

Ми також можемо використовувати 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"));

1
Чиста і проста відповідь
Арій Фірузіян

Як перевірити окремі значення? Коли я спробував перевірити масив char на char, я отримав повідомлення, яке charнеможливо перетворитиSystem.Predicate<char>
Aaron Franke

13

EDIT: Я також не помітив, що вам потрібна посада. Не можна IndexOfбезпосередньо використовувати значення типу масиву, оскільки воно явно реалізовано. Однак ви можете використовувати:

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

(Це схоже на виклик , Array.IndexOfяк у відповідь Дарін в -. Просто альтернативний підхід Це не зовсім ясно мені , чому це реалізовано в явному вигляді в масивах, але і не заперечує ...)IList<T>.IndexOf


як я можу знайти можливість світу в масиві за допомогою Contains?
MoShe

Чи є можливість перевірити рядовий елемент у рядковому масиві A, який існує в іншому рядковому масиві B?
Муралі Муругесан

@MuraliMurugesan: Це не ясно , що ви питаєте , - є чи два масиви мають якісь - або елементи спільного? Один конкретний предмет? (В останньому випадку той факт, що він також є в масиві, не має значення.)
Джон Скіт

Я намагався відповісти тут stackoverflow.com/a/22812525/1559213 . Я підкреслив, щоб повернути true / false для рядка Html.CheckBox. Насправді є масив місяців, а також модель, яка має кілька місяців. Якщо Модельний місяць присутній у масиві місяців, нам потрібно повернути true. Дякую за відповідь ракети :)
Муралі Муругесан

@MuraliMurugesan: Ну, це звучить якif (months.Contains(model.Month))
Джон Скіт

5

Ви можете використовувати Array.IndexOf()- зауважте, що він повернеться -1, якщо елемент не знайдено, і вам доведеться обробити цей випадок.

int index = Array.IndexOf(stringArray, value);

4

ви можете спробувати так ... ви можете використовувати Array.IndexOf (), якщо ви також хочете дізнатися позицію

       string [] arr = {"One","Two","Three"};
       var target = "One";
       var results = Array.FindAll(arr, s => s.Equals(target));

3

IMO найкращий спосіб перевірити, чи містить масив задане значення, це використовувати System.Collections.Generic.IList<T>.Contains(T item)метод наступним чином:

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

Повний зразок коду:

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[]масиви приватно реалізують кілька методів List<T>, таких як Count and Contains. Оскільки це явна (приватна) реалізація, ви не зможете скористатися цими методами, не сформувавши спочатку масив. Це не працює лише для рядків - ви можете використовувати цей трюк, щоб перевірити, чи містить масив будь-якого типу який-небудь елемент, якщо клас елемента реалізує IComparable.

Майте на увазі, що не всі IList<T>методи працюють таким чином. Спроба використовувати IList<T>метод Add у масиві не вдасться.


2
Ваша відповідь, в основному, така ж, як і відповідь Приянка. Він не дає індексу елемента, про що просила ОП.
reggaeguitar

@reggaeguitar Згоден з вами там!
Si8

Я шукав це рішення , хоча воно не відповідає повністю на питання.
Auspex

1

Ви можете спробувати це, він шукає індекс, що містить цей елемент, і він встановлює номер індексу як int, потім він перевіряє, чи є int більшим, ніж -1, тож якщо він 0 або більше, значить, він знайшов такий індекс - оскільки масиви засновані на 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");
            }

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

}

0

Я створив метод розширення для повторного використання.

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

        return false;
    }

Як це назвати:

string[] stringArray = { "text1", "text2", "text3", "text4" };
string value = "text3";
if(value.InArray(stringArray))
{
  //do something
}

Де те, positionщо просить ОП?
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.
}

Це дає помилку: 'System.Array' не містить визначення для 'містить'.
ePandit

-4

Найпростішим і коротшим методом було б наступне.

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

if(stringArray.Contains(value))
{
    // Do something if the value is available in Array.
}

3
Питання полягало у знаходженні позиції елемента в масиві .... З Containsметодом у вас немає цієї інформації
Bidou
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.