我需要通过LINQ计算一下。这是我用来计算长字符串数组中的单词的代码,但这不是很有效:
public static int WordCount(string haystack, string needle)
{
if (needle == null)
{
return 0;
}
string[] source = haystack.Split(new char[] { '.', '?', '!', ' ', ';', ':', ',', '*', '-' }, StringSplitOptions.RemoveEmptyEntries);
var matchQuery = from word in source
where word.ToLowerInvariant() == needle.ToLowerInvariant()
select word;
int count=matchQuery.Count();
return count;
}
假设我有一个这样的字符串:
Geo Prism GEO 1995 GEO* - ABS #16213899 HGEO-
如果我试着在上面的句子中找到GEO,我的例行程序没有返回正确的计数:我希望 4 。 我的日常生活有什么问题?
答案 0 :(得分:5)
我认为你的代码几乎是正确的,但是你没有得到4的原因是因为你需要做一个“包含”检查,因为最后一个Geo是hgeo的一部分(假设你想得到4,而不是3 )
var matchQuery = from word in source
where word.ToLowerInvariant.Contains(needle.ToLowerInvariant())
select word;
此外,您可能会发现通过以下方式分配文本可以获得更好的里程数:
Regex.Split(haystack, @"\W+")
哪会将你的文字拆分成一堆单词,忽略任何语法(未经测试,但我认为应该有效)
答案 1 :(得分:5)
你可以把它作为LINQ的单行代码:
void Main()
{
string data = "Geo Prism GEO 1995 GEO* - ABS #16213899 HGEO-";
var target = "GEO";
var count = data.Select((c, i) => data.Substring(i)).Count(sub => sub.ToUpper().StartsWith(target));
Console.WriteLine(count.ToString());
}
<强>结果:强>
4