LINQ的字数统计

Tho*_*mas 2 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;
}
Run Code Online (Sandbox Code Playgroud)

假设我有一个这样的字符串:

Geo Prism GEO 1995 GEO* - ABS #16213899 HGEO-
Run Code Online (Sandbox Code Playgroud)

如果我试图在上面的句子中找到GEO,我的例行程序不会返回正确的计数:我期望4.我的日常生活有什么问题?

Mat*_*rts 5

我认为你的代码几乎是正确的,但是你没有得到4的原因是因为你需要做一个"包含"检查,因为最后一个Geo是hgeo的一部分(假设你想得到4,而不是3)

var matchQuery = from word in source
    where word.ToLowerInvariant.Contains(needle.ToLowerInvariant())
    select word;
Run Code Online (Sandbox Code Playgroud)

此外,您可能会发现它可以为您分配文本提供更好的里程:

Regex.Split(haystack, @"\W+")
Run Code Online (Sandbox Code Playgroud)

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


slo*_*oth 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());
}
Run Code Online (Sandbox Code Playgroud)

结果:

4
Run Code Online (Sandbox Code Playgroud)