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 に答える