如何按照Linq中与数组匹配的单词数对字符串列表进行排序

时间:2014-02-13 15:24:22

标签: c# 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

3 个答案:

答案 0 :(得分:7)

使用Count代替Any

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

答案 1 :(得分:3)

使用List.Sort对原始列表进行排序而不是创建新列表的另一种方法:

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>,因为它对查找更有效,并且重复项不应该被计算多次。

答案 2 :(得分:1)

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

你在这里概念性地做的是查看两组单词的交集计数。交集是两个其他集合中存在的项集。