Является ли строка в массиве?

Каким будет лучший способ посмотреть в string[], чтобы увидеть, содержит ли он элемент. Это был мой первый удар. Но, возможно, есть кое-что, что я пропускаю. Размер массива будет не более 200 элементов.

bool isStringInArray(string[] strArray, string key)
{
    for (int i = 0; i <= strArray.Length - 1; i++)
        if (strArray[i].ToString() == key)
            return true;
    return false;
}

Ответ 1

Просто используйте уже встроенный метод Contains():

using System.Linq;

//...

string[] array = { "foo", "bar" };
if (array.Contains("foo")) {
    //...
}

Ответ 2

Я знаю, что это старо, но я хотел, чтобы новые читатели знали, что есть новый метод для этого, используя generics и методы расширения.

Вы можете прочитать мое сообщение , чтобы узнать больше о том, как это сделать, но основная идея такова:

Добавив этот метод расширения к вашему коду:

public static bool IsIn<T>(this T source, params T[] values)
{
    return values.Contains(source);
}

вы можете выполнить поиск следующим образом:

string myStr = "str3"; 
bool found = myStr.IsIn("str1", "str2", "str3", "str4");

Он работает на любом типе (пока вы создаете хороший метод equals). Любой тип значения наверняка.

Ответ 3

Вы просто после функции Array.Exists(или метод Содержит расширения, если вы используете .NET 3.5, что немного удобнее).

Ответ 4

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

Ответ 5

Linq (для s & g):

var test = "This is the string I'm looking for";
var found = strArray.Any(x=>x == test);

или, в зависимости от требований

var found = strArray.Any(
    x=>x.Equals(test, StringComparison.OrdinalIgnoreCase));

Ответ 6

Массивы, как правило, представляют собой плохую структуру данных для использования, если вы хотите спросить, находится ли какой-либо конкретный объект в коллекции или нет.

Если вы будете часто выполнять этот поиск, возможно, стоит использовать Dictionary<string, something>, а не массив. Поиск в словаре - это O (1) (постоянное время), при этом поиск по массиву равен O (N) (время пропорционально длине массива).

Даже если массив содержит всего 200 элементов, если вы выполняете много этих поисков, словарь, вероятно, будет быстрее.

Ответ 7

Вы также можете использовать LINQ для итерации по массиву. или вы можете использовать метод Find, который принимает делегата для его поиска. Однако я считаю, что метод find немного дороже, чем просто цикл.

Ответ 8

Это быстрее, чем повторение массива вручную:

static bool isStringInArray(string[] strArray, string key)
    {

        if (strArray.Contains(key))
            return true;
        return false;
    }

Ответ 9

Как уже упоминалось много раз в потоке выше, это зависит от используемой структуры. .Net Framework 3 и выше имеет методы .Contains() или Exists() для массивов. Для других фреймворков ниже можно сделать следующий трюк, а не цикл через массив...

((IList<string>)"Your String Array Here").Contains("Your Search String Here")

Не слишком уверен в эффективности... Dave

Ответ 10

Если вы не хотите или просто не можете использовать Linq, вы также можете использовать статическую функцию Array.Exists(...);:

https://msdn.microsoft.com/en-us/library/yw84x8be%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

var arr = new string[]{"bird","foo","cat","dog"};

var catInside = Array.Exists( 
  arr, // your Array
  (s)=>{ return s == "cat"; } // the Predicate
);

Когда Predicate вернет true, когда catInside также будет прав.