LINQ的字数统计

时间:2012-07-10 11:19:45

标签: c# 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 。 我的日常生活有什么问题?

2 个答案:

答案 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