2014-02-13 82 views
5

有沒有一種方法可以通過從字符串數組中匹配的字數來排序字符串列表?如何排序與Linq中的數組匹配的字數字符串列表

var targets = new string[] { "one", "two", "three" }; 
var list = new List<string>(); 
    list.Add("one little pony"); 
    list.Add("one two little pony"); 
    list.Add("one two three little pony"); 
    list.Add("little pony"); 
x = x.OrderByDescending(u => targets.Any(u.Contains)).ToList(); 
foreach(var item in list) 
{ 
Debug.Writeline(item); 
} 

有沒有一種方法來生成輸出,而無需使用其他listfor循環排序

one two three little pony 
one two little pony 
one little pony 
little pony 

回答

7

使用Count而不是Any

x = x.OrderByDescending(u => targets.Count(u.Contains)).ToList(); 
+0

謝謝斯坦利。我在原來提交的代碼中犯了一個錯誤。我編輯了代碼。請編輯你的答案從'u.Tags.Contains'到'u.Contains',以使其與編輯的代碼更相關。 –

+0

@FloodGravemind完成。 –

3

這種種的另一種方法原始列表List.Sort i創建一個新的nstead:

var targets = new HashSet<string> { "one", "two", "three" }; 
list.Sort((s1, s2) => -1 * (s1.Split().Count(targets.Contains) 
       .CompareTo(s2.Split().Count(targets.Contains)))); 

-1 *用於降序排序,所以最出現在上面。由於您提到您要計數,因此這也會被搜索子字符串的空白插入分割。

我已經使用了HashSet<string>,因爲查找效率更高,而且重複不應該只計算一次以上。

1
var query = list.OrderByDescending(phrase => 
    phrase.Split().Intersect(targets).Count()); 

你在這裏概念上做的是看兩組詞彙的交集。交集是兩個其他集合中存在的集合。