使用LINQ将拆分字符串保存到数组列表

本文关键字:数组 列表 保存 字符串 LINQ 拆分 使用 | 更新日期: 2023-09-27 18:17:11

我有一些代码,它接受一个字符串,并通过将其分成单词来处理它,并给出每个单词的计数。

问题是它只返回void,因为我只能在处理完成后打印到屏幕上。有什么方法可以将结果保存在arraylist中,以便我可以将其返回给调用它的方法吗?

当前代码:

message.Split(' ').Where(messagestr => !string.IsNullOrEmpty(messagestr))
               .GroupBy(messagestr => messagestr).OrderByDescending(groupCount => groupCount.Count())
               .Take(20).ToList().ForEach(groupCount => Console.WriteLine("{0}'t{1}", groupCount.Key, groupCount.Count()));

谢谢。

使用LINQ将拆分字符串保存到数组列表

试试这个代码

var wordCountList = message.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
    .GroupBy(messagestr => messagestr)
    .OrderByDescending(grp => grp.Count())
    .Take(20) //or take the whole
    .Select(grp => new KeyValuePair<string, int>(grp.Key, grp.Count()))
    .ToList(); //return wordCountList
//usage
wordCountList.ForEach(item => Console.WriteLine("{0}'t{1}", item.Key, item.Value));

如果您愿意,您可以返回wordCountList,它是包含所有单词及其计数的List<KeyValuePair<string, int>>,按降序排列。

如何使用,也显示在最后一行。

而不是从列表中删除first 20,如果你想要整个,删除这个.Take(20)部分。

首先,通过调用Take(20),您只需取出前20个单词并将其他单词放在一边。所以,如果你想要所有的结果,删除它。
之后,你可以这样做:

var words = message.Split(' ').
               Where(messagestr => !string.IsNullOrEmpty(messagestr)).
               GroupBy(messagestr => messagestr).
               OrderByDescending(groupCount => groupCount.Count()).                 
               ToList();
words.ForEach(groupCount => Console.WriteLine("{0}'t{1}", groupCount.Key, groupCount.Count()));   

要将结果放入其他数据结构中,可以使用以下方法之一:

var w = words.SelectMany(x => x.Distinct()).ToList(); //Add this line to get all the words in an array
// OR Use Dictionary
var dic = new Dictionary<string, int>();
foreach(var item in words)
{
    dic.Add(item.Key, item.Count());
}