我需要通过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。我的日常生活出了什么问题?
您可以使用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
我认为你的代码几乎是对的,但你没有得到4的原因是因为你需要做一个"Contains"检查,因为最后一个Geo是hgeo的一部分(假设你想要得到4,而不是3)
var matchQuery = from word in source
where word.ToLowerInvariant.Contains(needle.ToLowerInvariant())
select word;
此外,你可能会发现,使用分割文本会给你更好的里程数
Regex.Split(haystack, @"W+")
这将把你的文本分成一堆单词,忽略任何语法(未经测试,但我认为应该有效)