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

问题描述 投票:0回答:7

我有一根绳子:

string str = "hello";

还有一个数组:

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

与我的字符串(“hello”)比较时,我需要从数组中获取(“Hello”)的索引(不使用循环)。

我已经尝试过:

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

这会返回

-1
,因为大写的“H”,但我想要一个
1
的结果。

我什至尝试过

StringComparer.OrdinalIgnoreCase
但没有成功。

c# asp.net indexof ignore-case
7个回答
59
投票

当心!标记的答案可能有一些问题,例如

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 比特


9
投票

既然您正在寻找索引。试试这个方法。

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

6
投票

Array.IndexOf 调用默认的“Equals”方法,该方法区分大小写。试试这个:

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

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

3
投票

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,算法将完成,而不会转到其他单词。

如果你不想搜索子字符串但想搜索字符串,算法应该是固定的。可以通过添加检查子字符串从第一个字符

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

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

-1
投票

我有一个类似的问题,我需要该项目的索引,但它必须不区分大小写,我在网上浏览了几分钟,但什么也没找到,所以我只是写了一个小方法来完成它,这就是我做到了:

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

希望这有帮助,祝你好运!

© www.soinside.com 2019 - 2024. All rights reserved.