Как добавить параметр без учета регистра в Array.IndexOf

У меня есть строка

string str="hello";

Это мой массив

string[] myarr = new string[] {"good","Hello", "this" , "new"};

Мне нужно найти индекс "hello" из массива (без использования цикла)

Итак, я использовал

int index = Array.IndexOf(myarr, str);

Это возвращает -1, но я ожидаю результат как 1.

Я даже пробовал с помощью StringComparer.OrdinalIgnoreCase, но безрезультатно.

Надеюсь, кто-то может помочь. Спасибо.

Ответы

Ответ 1

Так как вы ищете индекс. Попробуйте этот путь.

Array.FindIndex(myarr, t => t.IndexOf(str, StringComparison.InvariantCultureIgnoreCase) >=0);

Ответ 2

Beaware!! Отмеченный ответ может иметь некоторые проблемы, например

string array[] = {"hello", "hi", "bye" , "welcome" , "hell"}

если вы используете тот же метод, который описан в ответе, чтобы найти индекс слова "ад"

Int Indexofary = Array.FindIndex(array, t => t.IndexOf("hell", StringComparison.InvariantCultureIgnoreCase) >=0);

вы получите результат Indexofary = 0 вместо 4.

Вместо этого используйте

Array.FindIndex(array, t => t.Equals("hell", StringComparison.InvariantCultureIgnoreCase));

чтобы получить правильный результат.

Rrgards Биты

Ответ 3

Array.IndexOf вызывает метод "Равно" по умолчанию, учитывающий регистр. Попробуйте следующее:

Array.FindIndex(myarr, t => t.Equals(str, StringComparison.InvariantCultureIgnoreCase))

Ответ 4

var result = myarr.FindIndex(s => s.Equals(str, StringComparison.OrdinalIgnoreCase));

Ответ 5

У меня была аналогичная проблема, мне нужен индекс элемента, но он должен был быть нечувствительным к регистру, я несколько минут смотрел вокруг Интернета и ничего не нашел, поэтому я написал небольшой метод, чтобы сделать это, здесь это то, что я сделал:

private static int getCaseInvariantIndex(List<string> ItemsList, string searchItem)
{
    List<string> lowercaselist = new List<string>();

    foreach (string item in ItemsList)
    {
        lowercaselist.Add(item.ToLower());
    }

    return lowercaselist.IndexOf(searchItem.ToLower());
}

Добавьте этот код в тот же файл и назовите его следующим образом:

int index = getCaseInvariantIndexFromList(ListOfItems, itemToFind);

Надеюсь, это поможет, удачи!

Ответ 6

1), если вы хотите искать только один раз и хотите сохранить исходный массив, вы можете использовать это:

        public static void example1()
        {
            string[] myarr = { "good", "Hello", "this", "new" };
            var str = "new";
            var res= Array.FindIndex(myarr, x=>string.Equals(x, str, StringComparison.InvariantCultureIgnoreCase));
        }

2), если вы будете искать много раз, будет лучше использовать это:

public static void example1()
    {
        string[] myarr = {"good", "Hello", "this", "new"};
        var str = "new";
        var res = Array.IndexOf(Array.ConvertAll(myarr, ToStringlowerCase), str.ToLowerInvariant());
    }

3) неверный ответ:

string array[] = {"hello", "hi", "bye" , "welcome" , "hell"}
Int Indexofary = Array.FindIndex(array, t => t.IndexOf("hell", StringComparison.InvariantCultureIgnoreCase) >=0);

не будет работать вообще, потому что он ищет не строку, а подстроку.

Алгоритм выполняет итерацию слов в массиве, когда принимается 1-е слово "привет", алгоритм пытается найти индекс "ад", и этот индекс равен 1. 1 is > then 0, и алгоритм будет закончен, не переходя к другим словам.

Если вы не хотите искать подстроки, но хотите искать строки, алгоритм должен быть исправлен. Этот алгоритм может быть исправлен путем добавления проверки того, что подстрока начинается с 1-го char t.IndexOf(str, StringComparison.InvariantCultureIgnoreCase) == 0, а длина слова равна str.Length == t.Length. Исправлено:

        public static int example3()
    {
        string[] myarr = { "hHello", "hi", "bye", "welcome", "hell" };
        var str = "hell";
        return Array.FindIndex(myarr, t => t.IndexOf(str, StringComparison.InvariantCultureIgnoreCase) == 0 && str.Length == t.Length);
    }

Ответ 7

Так как Array.IndexOf является общим, имеет смысл сделать общую функцию расширения:

public static int IndexOf<T>(this T[] source, T value)
{
  return IndexOf<T>(source, value, StringComparison.InvariantCultureIgnoreCase);
}

public static int IndexOf<T>(this T[] source, T value, StringComparison stringComparison)
{
  if (typeof(T) == typeof(string))
    return Array.FindIndex(source, m => m.ToString().Equals(value.ToString(), stringComparison));
  else
    return Array.IndexOf(source, value);
}