Мне нужно искать строку в массиве строк. Я не хочу использовать любой для зацикливания в нем
string [] arr = {"One","Two","Three"};
string theString = "One"
Мне нужно проверить, присутствует ли переменная var в обр.
Мне нужно искать строку в массиве строк. Я не хочу использовать любой для зацикливания в нем
string [] arr = {"One","Two","Three"};
string theString = "One"
Мне нужно проверить, присутствует ли переменная var в обр.
Каждый метод, о котором упоминалось ранее, выполняет цикл как внутри, так и снаружи, поэтому не важно, как его реализовать. Вот еще один пример поиска всех ссылок целевой строки
string [] arr = {"One","Two","Three"};
var target = "One";
var results = Array.FindAll(arr, s => s.Equals(target));
Ну, что-то придется искать, а цикл более эффективен, чем рекурсия (так как рекурсия хвоста не реализована полностью)... поэтому, если вы просто не хотите зацикливать себя, то любой из
bool has = arr.Contains(var); // .NET 3.5
или
bool has = Array.IndexOf(arr, var) >= 0;
Для справки: избегать имен, таких как var - это ключевое слово в С# 3.0.
Должна ли быть строка []? A List <String> даст вам то, что вам нужно.
List<String> testing = new List<String>();
testing.Add("One");
testing.Add("Two");
testing.Add("Three");
testing.Add("Mouse");
bool inList = testing.Contains("Mouse");
bool exists = arr.Contains("One");
Я думаю, что лучше использовать Array.Exists, чем Array.FindAll.
Это довольно просто. Я всегда использую этот код для поиска строки из массива строк
string[] stringArray = { "text1", "text2", "text3", "text4" };
string value = "text3";
int pos = Array.IndexOf(stringArray, value);
if (pos > -1)
{
return true;
}
else
{
return false;
}
Если массив отсортирован, вы можете использовать BinarySearch. Это операция O (log n), поэтому она быстрее, чем циклическая. Если вам нужно применить несколько поисков и скорость, вы можете сортировать ее (или копию) перед ее использованием.
Каждый класс, реализующий IList, имеет метод Содержит (значение объекта). И система System.Array.
Почему запрет "Я не хочу использовать какой-либо цикл"? Это самое очевидное решение. Если у вас есть шанс быть очевидным, возьмите его!
Обратите внимание, что вызовы типа arr.Contains(...)
по-прежнему будут циклическими, это будет не тот, кто написал цикл.
Считаете ли вы альтернативное представление, которое более подходит для поиска?
arr
будет сортироваться, вы можете использовать двоичный поиск (который нужно будет перезаписывать или цитировать, но не так часто, как прямой линейный поиск).На первом снимке я мог бы придумать что-то вроде этого (но это псевдокод и предполагая, что вы не можете использовать какие-либо встроенные библиотеки .NET). Может потребоваться немного подстройки и переосмысления, но должно быть достаточно хорошо для начала, может быть?
int findString(String var, String[] stringArray, int currentIndex, int stringMaxIndex)
{
if currentIndex > stringMaxIndex
return (-stringMaxIndex-1);
else if var==arr[currentIndex] //or use any string comparison op or function
return 0;
else
return findString(var, stringArray, currentIndex++, stringMaxIndex) + 1 ;
}
//calling code
int index = findString(var, arr, 0, getMaxIndex(arr));
if index == -1 printOnScreen("Not found");
else printOnScreen("Found on index: " + index);
В С#, если вы можете использовать ArrayList, вы можете использовать метод Contains, который возвращает boolean:
if MyArrayList.Contains("One")
Вы можете использовать Найти метод типа массива. От .NET 3.5 и выше.
public static T Find<T>(
T[] array,
Predicate<T> match
)
Вот несколько примеров:
// we search an array of strings for a name containing the letter "a":
static void Main()
{
string[] names = { "Rodney", "Jack", "Jill" };
string match = Array.Find (names, ContainsA);
Console.WriteLine (match); // Jack
}
static bool ContainsA (string name) { return name.Contains ("a"); }
Вот тот же код, сокращенный анонимным методом:
string[] names = { "Rodney", "Jack", "Jill" };
string match = Array.Find (names, delegate (string name)
{ return name.Contains ("a"); } ); // Jack
Выражение лямбда сокращает его далее:
string[] names = { "Rodney", "Jack", "Jill" };
string match = Array.Find (names, n => n.Contains ("a")); // Jack
Вы можете проверить существование элемента на
arr.Any(x => x == "One")