我有一个清单:
var myList = new List<string> { "red", "blue", "green" };
我有一个字符串:
var myString = "Alfred has a red and blue tie";
我正在尝试计算myList
内myString
内的字词匹配数。目前,我正在使用.Contains()
,这使得我数为3,因为它正在拾取“Alfred”中的“红色”。我需要能够代替词语。如何实现这一目标?
var count = myList.Where(ml => myString.Contains(ml)); // gets 3, want 2
答案 0 :(得分:4)
var myList = new List<string> { "red", "blue", "green" };
Regex r = new Regex("\\b(" + string.Join("|", myList.ToArray()) + ")\\b");
MatchCollection m = r.Matches("Alfred has a red and blue tie");
m.Count会给你红色,蓝色或绿色的次数。 \ b指定单词边界。
m的每个元素都是Type Match,您可以查看每个索引以获取更多信息(即m [0] .Value为您提供匹配的字符串(红色)和m [0] .Index为您提供位置在原始字符串(13))。
答案 1 :(得分:1)
var count = (from s in myList
join ms in myString.Split() on s equals ms
select new { s, ms }).Count();
答案 2 :(得分:0)
这样的东西?
var numMatches = myString.Split().Intersect(myList).Count();
请注意,这不会考虑重复出现。
如果你想考虑重复,请使用@Justin Niessner的技巧。 这是一个替代方案,具有中间查找:
var words = myString.Split().ToLookup(word => word);
var numMatches = myList.Sum(interestingWord => words[interestingWord].Count());
答案 3 :(得分:0)