我有一个字符串
string str="hello";
这是我的数组
string[] myarr = new string[] {"good","Hello", "this" , "new"};
我需要从数组中找到“hello”的索引(不使用循环)
所以我用过
int index = Array.IndexOf(myarr, str);
这会返回-1,但我希望结果为1。
我甚至尝试过使用StringComparer.OrdinalIgnoreCase
,但无济于事。
希望有人可以提供帮助。感谢。
答案 0 :(得分:33)
Beaware !!标记的答案可能有一些问题,例如
string array[] = {"hello", "hi", "bye" , "welcome" , "hell"}
如果您使用与答案中描述的方法相同的方法来查找单词“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 位
答案 1 :(得分:8)
因为您正在寻找索引。试试这种方式。
Array.FindIndex(myarr, t => t.IndexOf(str, StringComparison.InvariantCultureIgnoreCase) >=0);
答案 2 :(得分:3)
Array.IndexOf调用区分大小写的默认“Equals”方法。试试这个:
Array.FindIndex(myarr, t => t.Equals(str, StringComparison.InvariantCultureIgnoreCase))
答案 3 :(得分:1)
var result = myarr.FindIndex(s => s.Equals(str, StringComparison.OrdinalIgnoreCase));
答案 4 :(得分:1)
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);
根本不起作用,因为它不搜索字符串,而是搜索子字符串。
算法迭代数组中的单词,当第一个单词“hello”被采用时,算法试图找到'hell'的索引并且该索引是1. 1是>然后0和算法将完成而不会去其他单词。
如果您不想搜索子字符串但想要搜索字符串,则应修复algorythm。可以通过添加检查子字符串从第一个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);
}
答案 5 :(得分:0)
我有一个类似的问题,我需要项目的索引,但它必须不区分大小写,我在网上看了几分钟,什么都没找到,所以我只是写了一个小方法来完成它,这里就是我做的:
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 :(得分:0)
由于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);
}