2

我有一个清单:

var myList = new List<string> { "red", "blue", "green" };

我有一个字符串:

var myString = "Alfred has a red and blue tie";

我正在尝试计算 inside 中的单词匹配myListmyString。目前,我正在使用.Contains(),这让我得到了 3 的计数,因为它在“Alfred”中拾取“红色”。我需要能够单独使用单词。如何做到这一点?

var count = myList.Where(ml => myString.Contains(ml)); // gets 3, want 2
4

4 回答 4

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 的每个元素都是类型匹配,您可以查看每个索引以获取更多信息(即 m[0].Value 为您提供匹配的字符串(红色),m[0].Index 为您提供原始位置字符串 (13))。

于 2010-10-20T19:14:03.847 回答
1
var count = (from s in myList
            join ms in myString.Split() on s equals ms
            select new { s, ms }).Count();
于 2010-10-20T19:09:41.390 回答
1

像这样的东西?

var numMatches = myString.Split().Intersect(myList).Count();

请注意,这不考虑重复出现。

如果您确实想考虑重复,请使用@Justin Niessner 的技术。这是一种替代方法,带有中间查找:

var words = myString.Split().ToLookup(word => word);
var numMatches = myList.Sum(interestingWord => words[interestingWord].Count());
于 2010-10-20T19:10:13.570 回答
0

这工作 \bred\b|\bblue\b|\bgreen\b 我不确定它是最优化的

于 2010-10-20T19:12:37.360 回答