StartsWith的扩展,用于搜索所有单词

时间:2013-03-30 18:55:25

标签: c# linq search autosuggest startswith

是否有字符串的StartsWith的扩展,它在字符串中的每个单词的开头搜索?

像: "Ben Stiller".StartsWithExtension("Sti")返回true

我想这样,所以我可以为搜索做出一个谓词。

让我们说有一个名为Persons的列表,ICollection<Person>
每个人都有一个属性名称,其值为“Ben Stiller”或“Adam Sandler”。

我希望能够执行以下谓词:

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

由于 (欢迎实现这一目标的其他更好的方法)

5 个答案:

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

答案 1 :(得分:2)

可能最简洁的方法是使用正则表达式:

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

这比在字符''上拆分源字符串更可靠,因为它可以处理其他空白字符。

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

答案 3 :(得分:0)

你甚至可以这样检查:

bool flag = (sample_str.StartsWith("Sti" ) || sample_str.Contains(".Sti") || sample_str.Contains(" Sti")) 

答案 4 :(得分:0)

    public static bool ContainsWordStartingWith(this string aString, string startingWith)
    {
        return aString.Split(' ').Any(w => w.StartsWith(startingWith));
    }