Строка в массиве? - PullRequest
       7

Строка в массиве?

96 голосов
/ 01 февраля 2009

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

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

Ответы [ 10 ]

188 голосов
/ 01 февраля 2009

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

using System.Linq;

//...

string[] array = { "foo", "bar" };
if (array.Contains("foo")) {
    //...
}
23 голосов
/ 19 ноября 2011

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

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

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

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

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

12 голосов
/ 01 февраля 2009

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

6 голосов
/ 01 февраля 2009

Linq (для s & g's):

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 голосов
/ 01 февраля 2009

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

2 голосов
/ 01 февраля 2009

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

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

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

1 голос
/ 14 марта 2011

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

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

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

1 голос
/ 01 февраля 2009

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

0 голосов
/ 08 июня 2016

Если вы не хотите или просто не можете использовать 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
);

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

0 голосов
/ 01 февраля 2009

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

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

        if (strArray.Contains(key))
            return true;
        return false;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...