如何向Array.IndexOf添加不区分大小写的选项

时间:2012-01-20 00:03:14

标签: c# asp.net

我有一个字符串

string str="hello";

这是我的数组

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

我需要从数组中找到“hello”的索引(不使用循环)

所以我用过

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

这会返回-1,但我希望结果为1。

我甚至尝试过使用StringComparer.OrdinalIgnoreCase,但无济于事。

希望有人可以提供帮助。感谢。

7 个答案:

答案 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);
}