2

.NET中有一个功能 public static TSource ElementAt<TSource>(this IEnumerable<TSource> source, int index);

有没有一种简单的方法可以使用类似的函数来找出子字符串是否出现在某个位置(索引)?

我是说:

public static bool ElementAtPosContains(this string, int index, string[] valuesToCheck)
{ ... }


string test1 = "abcd5f";
string[] substrings = {"1" , "2", "3", "4", "5"};
if (test.ElementAtPosContains(4, substrings))
 {
    DoSomething();
 }

如果字符串中的 4 位置有 1、2、3、4、5 - 返回 true。我可以做这件事:

   public static bool ElementAtPosContains(this string inputStr, int index, string[] valuesToCheck)
   { 
     if (valuesToCheck == null)
       return false;

     foreach (string value in valuesToCheck)
     {
       if (inputStr.Substring(index, value.Length) == value)
         return true;
     }
     return false;
    }

但这似乎不是很有效

4

2 回答 2

1

这似乎更聪明:

public static bool ElementAtPosContains(this string inputStr, int index, IList<String> valuesToCheck)
{
    if (valuesToCheck == null || inputStr.Length < index)
        return false;

    return valuesToCheck.Any(s => s.Length + index <= inputStr.Length 
                             &&   inputStr.IndexOf(s, index) == index);
}

演示

虽然我认为你正在做过早的优化。

于 2013-02-08T08:42:08.247 回答
1

试试这个:

    public static bool ElementAtPosContains(this string inputStr, int index, string[] valuesToCheck)
    {
        if (valuesToCheck == null || valuesToCheck.Length == 0 || inputStr.Length < index)
            return false;

        return valuesToCheck.Any(sub => string.CompareOrdinal(inputStr, index, sub, 0, sub.Length) == 0);
    }

CompareOrdinal比较总是区分大小写,并且不考虑文化。这使他们比平时Compare=操作员更快。如果您不需要区分区域性的比较或不区分大小写的比较,则此方法应该可以更快地完成工作,因为它比较字符串中字符的数值。

演示

于 2013-02-08T08:44:53.667 回答