Мені потрібно знайти рядок у масиві рядків. Я не хочу використовувати будь-який для циклу в ньому
string [] arr = {"One","Two","Three"};
string theString = "One"
Мені потрібно перевірити, чи в аргументі присутня змінна TheString.
Мені потрібно знайти рядок у масиві рядків. Я не хочу використовувати будь-який для циклу в ньому
string [] arr = {"One","Two","Three"};
string theString = "One"
Мені потрібно перевірити, чи в аргументі присутня змінна TheString.
Відповіді:
Кожен метод, згаданий раніше, виконує циклічність як внутрішньо, так і зовні, тому насправді не важливо, як його реалізувати. Ось ще один приклад пошуку всіх посилань на цільовий рядок
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 - це ключове слово в C # 3.0.
Це має бути рядок []? Список <String> надасть вам те, що вам потрібно.
List<String> testing = new List<String>();
testing.Add("One");
testing.Add("Two");
testing.Add("Three");
testing.Add("Mouse");
bool inList = testing.Contains("Mouse");
Я думаю, що краще використовувати 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, має метод Contains (значення об'єкта) . І так само 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);
У C #, якщо ви можете використовувати ArrayList, ви можете використовувати метод Contains, який повертає логічне значення:
if MyArrayList.Contains("One")
Ви можете використовувати метод Find типу Array. Від .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
Я здивований, що ніхто не пропонував використовувати Array.IndexOfметод.
Дійсно, Array.IndexOfмає дві переваги:
int stringIndex = Array.IndexOf(arr, theString);
if (stringIndex >= 0)
{
// theString has been found
}
Вбудована версія:
if (Array.IndexOf(arr, theString) >= 0)
{
// theString has been found
}