Проверка, содержит ли строковый массив значение, и если да, получение его позиции

163

У меня есть этот массив строк:

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

Я хотел бы определить, stringArrayсодержит ли value. Если это так, я хочу найти свою позицию в массиве.

Я не хочу использовать петли. Кто-нибудь может подсказать, как мне это сделать?

Moshe
источник

Ответы:

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 в течение нескольких месяцев. Кстати, это вычислительно быстрее, чем ответ 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)
BLUEPIXY
источник
7
Это должен быть принятый ответ, потому что он позволяет передавать лямбду, чтобы делать более сложные вещи, такие как Array.FindIndex (array, x => x.StartsWith ("insert string here"))
reggaeguitar
1
Но вопрос не в этом. Вопрос спрашивает, как найти известное значение из массива.
Карл Гьерцен
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не может быть преобразовано вSystem.Predicate<char>
Аарон Франке
13

РЕДАКТИРОВАТЬ: Я не заметил, что вам также нужна должность. Вы не можете IndexOfнапрямую использовать значение типа массива, потому что оно реализовано явно. Тем не менее, вы можете использовать:

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

(Это похоже на вызов Array.IndexOfсогласно ответу Дарина - просто альтернативный подход. Мне не ясно, почему это реализовано явно в массивах, но не берите в голову ...)IList<T>.IndexOf

Джон Скит
источник
Как мне найти возможность мира в массиве с помощью Contains?
Моше
Есть ли возможность проверить строковый элемент в строковом массиве A, существующий в другом строковом массиве B?
Мурали Муругесан
@MuraliMurugesan: Непонятно, о чем вы спрашиваете - есть ли у двух массивов какие- либо общие элементы? Один конкретный предмет? (В последнем случае тот факт, что он также находится в массиве, не имеет значения.)
Джон Скит,
Я пытался ответить здесь stackoverflow.com/a/22812525/1559213 . Я попытался вернуть true / false для строки Html.CheckBox. На самом деле существует массив месяцев, а также модель, которая имеет несколько месяцев. Если Месяц модели присутствует в массиве месяцев, мы должны вернуть true. Спасибо за ответ ракеты :)
Murali Murugesan
@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));
Enigma State
источник
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 и Contains. Поскольку это явная (частная) реализация, вы не сможете использовать эти методы без предварительного приведения массива. Это работает не только для строк - вы можете использовать этот трюк, чтобы проверить, содержит ли массив любого типа какой-либо элемент, при условии, что класс элемента реализует IComparable.

Имейте в виду, что не все IList<T>методы работают таким образом. Попытка использовать IList<T>метод Add для массива потерпит неудачу.

pKami
источник
2
Ваш в основном тот же ответ, что и Приянка. Он не дает индекс элемента, который запрашивал OP.
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); }

}
user5248404
источник
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
}
james31rock
источник
Где это то, 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 16.12.15
-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