Ответ 1
Так как вы ищете индекс. Попробуйте этот путь.
Array.FindIndex(myarr, t => t.IndexOf(str, StringComparison.InvariantCultureIgnoreCase) >=0);
У меня есть строка
string str="hello";
Это мой массив
string[] myarr = new string[] {"good","Hello", "this" , "new"};
Мне нужно найти индекс "hello" из массива (без использования цикла)
Итак, я использовал
int index = Array.IndexOf(myarr, str);
Это возвращает -1, но я ожидаю результат как 1.
Я даже пробовал с помощью StringComparer.OrdinalIgnoreCase
, но безрезультатно.
Надеюсь, кто-то может помочь. Спасибо.
Так как вы ищете индекс. Попробуйте этот путь.
Array.FindIndex(myarr, t => t.IndexOf(str, StringComparison.InvariantCultureIgnoreCase) >=0);
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 Биты
Array.IndexOf вызывает метод "Равно" по умолчанию, учитывающий регистр. Попробуйте следующее:
Array.FindIndex(myarr, t => t.Equals(str, StringComparison.InvariantCultureIgnoreCase))
var result = myarr.FindIndex(s => s.Equals(str, StringComparison.OrdinalIgnoreCase));
У меня была аналогичная проблема, мне нужен индекс элемента, но он должен был быть нечувствительным к регистру, я несколько минут смотрел вокруг Интернета и ничего не нашел, поэтому я написал небольшой метод, чтобы сделать это, здесь это то, что я сделал:
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);
Надеюсь, это поможет, удачи!
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);
}
Так как 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);
}