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


что было бы лучшим способом, чтобы посмотреть в 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;
}
10 92

10 ответов:

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

using System.Linq;

//...

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

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

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

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

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). Любой тип значения наверняка.

вы просто после массива.Существует функция (или содержит метод расширения, если вы используете .NET 3.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));

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

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

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

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

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

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

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

Я не уверен в эффективности... Дэйв

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

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

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

Если вы не хотите или просто не можете использовать LINQ, вы также можете использовать статический!--1--> функция:

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

когда предикат действительно возвращает true, как только catInside будет истинным.