Чи є рядок у масиві?


107

Що було б найкращим способом шукати в a, 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;
}

Відповіді:


210

Просто використовуйте вже вбудований метод Contains ():

using System.Linq;

//...

string[] array = { "foo", "bar" };
if (array.Contains("foo")) {
    //...
}

Чомусь, коли я вперше шукав метод, я не міг його знайти ... дякую.
Бред

4
@Brad: Це тому, що його метод розширення походить від Unumerable.
AnthonyWJones

8
Як однолінійний:(new string[] { "foo", "bar" }).Contains("foo")
Денис V

8
Ще коротше:new[] { "foo", "bar" }.Contains(foo)
Ерік Бол-Фейсот

25

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

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

Додавши цей метод розширення у свій код:

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

Він працює на будь-якому типі (доки ви створите хороший метод рівних). Будь-який тип значення точно.


У мене є щось подібне, var xxx = csvData.Rows[0].ItemArray[0].IsIn(".00", "0.0", ".25", "0.5", ".5", ".50", ".75");що я хочу зробити, це переглядати дані, хто знаходиться в першому стовпчику, щоб побачити, чи не закінчуються значення в жодному з наступних рядків .. якщо вони не стають, я хочу повернути рядок із зазначенням, що у нього відсутнє значення, .00наприклад, використовуючи ваш приклад, я не можу зробити так, щоб цей працював, трохи складніше, оскільки я не хочу повертати бул. Я змінив ваш метод, щоб повернути рядок, але все ще не працює жодних пропозицій
Метод

Це здається краще поставленим як питання на сайті. Далі і посилайтесь на цю відповідь, якщо потрібно.
Габріель МакАдамс

Мені реально вдалося придумати дивовижний спосіб зробити те, що я хотів зробити, я написав щось, що перевірить, чи є значення рядка всередині циклу for для циклу Datatables ItemArray, що закінчується будь-яким із наведених нижче значень у моєму string public static bool EndWithValue(this string value, IEnumerable<string> values) { return values.Any(item => value.EndsWith(item)); }
MethodMan

12

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


3
Ось робочий приклад для .NET 2.0: якщо (Array.Exists (arrayToLookThrough, про => про == elementToSearchFor))
Живиться

7

Linq (для людей, що входять до групи):

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


2

Масиви, як правило, є поганою структурою даних, яку слід використовувати, якщо ви хочете запитати, чи є певний об'єкт у колекції чи ні.

Якщо ви будете часто шукати цей пошук, можливо, варто використовувати його, Dictionary<string, something>а не масив. Шукання у словнику - це O (1) (постійний час), а пошук через масив - O (N) (потрібен час, пропорційний довжині масиву).

Навіть якщо у масиві максимум 200 елементів, якщо ви здійснюєте багато таких пошуків, словник, швидше за все, буде швидшим.


1
бінарний пошук - O (log n); словник підпорядковується O (1) - але накладних витрат багато; для малого та середнього розміру лінійний або двійковий пошук може бути вищим.
Марк Гравелл

1

Ви також можете використовувати LINQ для повторення масиву. або ви можете скористатися методом Find, який потребує делегата для його пошуку. Однак я думаю, що знайти метод трохи дорожче, ніж просто переглядати.


Метод Find буде алгоритмічно ідентичний методу "прокручування". Будь-яка додаткова витрата буде створювати об’єкти, а може бути і шар або два непрямих, але якщо ви переживаєте за оптимізацію цих коштів за рахунок читабельності, ви переживаєте про неправильні речі.
AwesomeTown

1

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

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

Не надто впевнений у ефективності ... Дейв


0

Це швидше, ніж ітерація через масив вручну:

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

        if (strArray.Contains(key))
            return true;
        return false;
    }

використання LINQ швидше, ніж повторення через рядок, як це було зроблено в прикладі. strArray.Contains (ключ) - це все, що дійсно потрібно
Кріс Баланс

3
За лаштунками strArray.Contains (ключ) все одно просто пройде через масив ... немає ніякої магії, яка не дозволяє вам шукати O (n) пошуку.
AwesomeTown

0

Якщо ви не хочете або просто не можете використовувати 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.

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