Word count by LINQ



我需要通过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+")

这将把你的文本分成一堆单词,忽略任何语法(未经测试,但我认为应该有效)

最新更新