4

文字列内のすべての単語の先頭で検索する文字列の StartsWith の拡張子はありますか?

次のようなもの: "Ben Stiller".StartsWithExtension("Sti")true を返す

検索用の述語を作るためにこれが欲しい。

Persons という名前のリストがICollection<Person>
あるとします。各人には、"Ben Stiller" や "Adam Sandler" などの値を持つプロパティ Name があります。

次のような述語を実行できるようにしたい:

Persons.Where(p => p.Name.StartsWithExtension(query))

ありがとう(これを達成するための他のより良い方法は大歓迎です)

4

5 に答える 5

6

次のように、最初に文字列を単語で分割できます。

var result = "Ben Stiller".Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries)
                          .Any(x => x.StartsWith("Sti"));

もちろん、次のように、独自の拡張メソッドとしてこれを記述することもできます。

public static bool AnyWordStartsWith(this string input, string test)
{
    return input.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries)
                .Any(x => x.StartsWith(test));
}
于 2013-03-30T19:04:09.413 に答える
2

おそらく最も簡潔なアプローチは、正規表現を使用することです。

public static bool StartsWithExtension(this string value, string toFind)
{
    return Regex.IsMatch(value, @"(^|\s)" + Regex.Escape(toFind));
}

これは、ソース文字列を文字 ' ' で分割するよりも信頼性が高くなります。これは、他の空白文字を処理できるためです。

于 2013-03-30T19:10:33.623 に答える
1

代わりに「ToWords」メソッドを作成し、その結果を StartsWith にフィードしてみませんか?

実際、「ToWords」はすでに存在しています。

編集:笑いのために、倍数で動作させましょう

 var someNames = new []{ "Sterling Archer", "Cyril Figgus" };
 var q = someNames
    .Select(name => name.Split(' '))
    .SelectMany( word => word)
     // the above chops into words
    .Where(word => word.StartsWith("Arch"));
于 2013-03-30T19:04:12.983 に答える
0

この方法で確認することもできます:

bool flag = (sample_str.StartsWith("Sti" ) || sample_str.Contains(".Sti") || sample_str.Contains(" Sti")) 
于 2013-03-30T19:07:43.110 に答える