2013-03-30 66 views
4

是否有字符串的StartsWith擴展名,它在字符串中的每個單詞的開始處搜索?StartsWith搜索全部詞的延伸

喜歡的東西: "Ben Stiller".StartsWithExtension("Sti")返回true

我想要這個,所以我可以做謂語進行搜索。

可以說有一個名單叫人,ICollection<Person>
每個人都有一個屬性名稱,像「本斯蒂勒」或「亞當桑德勒」的值。

我希望能夠做謂語,如:

+0

如果姓氏具有其自己的含義 - 在這種情況下,您希望通過它進行搜索/過濾 - 將名稱拆分爲2個屬性是有意義的 - 名字和姓氏(也許是全部名字,以便於打印/記錄或任何你要做的人對象) –

+0

那麼,最簡​​單的(即使它不是「最好的」)方式可能是'Contains(「」+ str);'... – Carsten

+0

if(sample_str.StartsWith(「Sti」)|| sample_str.Contains(「。Sti」)|| sample_str.Contains(「Sti」))return true;' –

回答

6

您可以用文字分割字符串了

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

感謝 (實現的其他更好的方法這是歡迎)首先,像這樣的:

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

爲什麼不改爲創建一個「ToWords」方法,然後將結果提供給StartsWith?

事實上,「毛詩補傳」已經種存在:

編輯:於笑聲,讓我們有它的倍數工作

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")); 
0

那麼你甚至可以檢查它是這樣的:

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

可能最簡潔的方法是使用正則表達式:

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

這比分割字符''上的源字符串更可靠,因爲它可以處理其他空格字符。

+0

+1。良好的解決方案,更靈活。 –

+0

此外,由於bcl正則表達式中固有的僞cacheiness,您可能會看到重複查詢的性能提升(swag) – JerKimball

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