检查位置是否出现多个子串的最快方法

时间:2013-02-08 08:31:52

标签: c# .net string

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

但这似乎不是很有效

2 个答案:

答案 0 :(得分: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);
}

Demo

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

答案 1 :(得分: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=运算符更快。如果您不需要文化感知比较或不区分大小写的比较,则此方法应该更快地完成工作,因为它会比较字符串中字符的数值。

Demo