Ответ 1
Просто используйте уже встроенный метод Contains():
using System.Linq;
//...
string[] array = { "foo", "bar" };
if (array.Contains("foo")) {
//...
}
Каким будет лучший способ посмотреть в 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;
}
Просто используйте уже встроенный метод Contains():
using System.Linq;
//...
string[] array = { "foo", "bar" };
if (array.Contains("foo")) {
//...
}
Я знаю, что это старо, но я хотел, чтобы новые читатели знали, что есть новый метод для этого, используя 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). Любой тип значения наверняка.
Вы просто после функции Array.Exists(или метод Содержит расширения, если вы используете .NET 3.5, что немного удобнее).
Является ли массив отсортированным? Если это так, вы можете сделать двоичный поиск. Здесь реализация .NET. Если массив отсортирован, бинарный поиск улучшит производительность по сравнению с любым итерационным решением.
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));
Массивы, как правило, представляют собой плохую структуру данных для использования, если вы хотите спросить, находится ли какой-либо конкретный объект в коллекции или нет.
Если вы будете часто выполнять этот поиск, возможно, стоит использовать Dictionary<string, something>
, а не массив. Поиск в словаре - это O (1) (постоянное время), при этом поиск по массиву равен O (N) (время пропорционально длине массива).
Даже если массив содержит всего 200 элементов, если вы выполняете много этих поисков, словарь, вероятно, будет быстрее.
Вы также можете использовать LINQ для итерации по массиву. или вы можете использовать метод Find, который принимает делегата для его поиска. Однако я считаю, что метод find немного дороже, чем просто цикл.
Это быстрее, чем повторение массива вручную:
static bool isStringInArray(string[] strArray, string key)
{
if (strArray.Contains(key))
return true;
return false;
}
Как уже упоминалось много раз в потоке выше, это зависит от используемой структуры. .Net Framework 3 и выше имеет методы .Contains() или Exists() для массивов. Для других фреймворков ниже можно сделать следующий трюк, а не цикл через массив...
((IList<string>)"Your String Array Here").Contains("Your Search String Here")
Не слишком уверен в эффективности... Dave
Если вы не хотите или просто не можете использовать 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 также будет прав.