Як шукати рядок у масиві рядків


77

Мені потрібно знайти рядок у масиві рядків. Я не хочу використовувати будь-який для циклу в ньому

string [] arr = {"One","Two","Three"};

string theString = "One"

Мені потрібно перевірити, чи в аргументі присутня змінна TheString.

Відповіді:


76

Кожен метод, згаданий раніше, виконує циклічність як внутрішньо, так і зовні, тому насправді не важливо, як його реалізувати. Ось ще один приклад пошуку всіх посилань на цільовий рядок

       string [] arr = {"One","Two","Three"};
       var target = "One";
       var results = Array.FindAll(arr, s => s.Equals(target));

10
Array.Exists () краще, я думаю.
Девід Тілен,

Це відповідна відповідь для фільтрування масиву з
пошуковим терміном

127

Ну, щось потрібно буде шукати, а цикл є більш ефективним, ніж рекурсія (оскільки рекурсія кінця не реалізована повністю) ... так що якщо ви просто не хочете циклічно себе робити, то будь-що з:

bool has = arr.Contains(var); // .NET 3.5

або

bool has = Array.IndexOf(arr, var) >= 0;

Для інформації: уникайте імен, таких як var - це ключове слово в C # 3.0.


27

Це має бути рядок []? Список <String> надасть вам те, що вам потрібно.

List<String> testing = new List<String>();
testing.Add("One");
testing.Add("Two");
testing.Add("Three");
testing.Add("Mouse");
bool inList = testing.Contains("Mouse");



11

Це досить просто. Я завжди використовую цей код для пошуку рядка з масиву рядків

string[] stringArray = { "text1", "text2", "text3", "text4" };
string value = "text3";
int pos = Array.IndexOf(stringArray, value);
if (pos > -1)
{
    return true;
}
else
{
    return false;
}

7

Якщо масив відсортовано, ви можете використовувати BinarySearch . Це операція O (log n), тому вона швидша, як цикл. Якщо вам потрібно застосувати кілька пошуків, і швидкість викликає занепокоєння, ви можете відсортувати її (або копію) перед використанням.



4

Чому заборона "Я не хочу використовувати жодних циклів"? Це найбільш очевидне рішення. Коли вам дають шанс бути очевидним, скористайтеся цим!

Зверніть увагу, що дзвінки типу arr.Contains(...)все ще продовжують цикл , просто ви не написали цикл.

Ви розглядали альтернативне представництво, яке більш піддається пошуку?

  • Хороша реалізація набору мала б ефективність. (HashSet, TreeSet або локальний еквівалент).
  • Якщо ви можете бути впевнені, що arrце відсортовано, ви можете скористатися двійковим пошуком (який потребував би повторення або циклу, але не так часто, як прямий лінійний пошук).

2

На першому пострілі я міг би придумати щось подібне (але це псевдокод і припускаючи, що ви не можете використовувати будь-які вбудовані бібліотеки .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);

2

У C #, якщо ви можете використовувати ArrayList, ви можете використовувати метод Contains, який повертає логічне значення:

if MyArrayList.Contains("One")

4
у .NET 2.0 завжди віддайте перевагу List <T> перед ArrayList. List <string> зробив би те саме, але з кращою безпекою типу та більшою гнучкістю.
Марк Гравелл

2

Ви можете використовувати метод 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

2

Ви можете перевірити наявність елемента за допомогою

arr.Any(x => x == "One")

0

вона стара, але так я це роблю,

enter code herevar result = Array.Find (names, element => element == "One");


0

Я здивований, що ніхто не пропонував використовувати 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
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.