C# Lambda函数查找列表C中最流行的单词

C# Lambda函数查找列表C中最流行的单词,c#,lambda,C#,Lambda,我现在有一个C语言的lambda函数,对编码来说是相当陌生的&以前没有使用过lambda函数,所以简单一点,它将FilteredList中的重复字符串添加到列表中,统计出现的次数,并将该值存储在count中。我只想要列表中使用最多的单词,这是我通过小组完成的。OrderBy。。。等线,但我很肯定,我已经使这对我自己非常复杂,非常低效。以及添加字典和键值对 var groups = from s in FilteredList gro

我现在有一个C语言的lambda函数,对编码来说是相当陌生的&以前没有使用过lambda函数,所以简单一点,它将FilteredList中的重复字符串添加到列表中,统计出现的次数,并将该值存储在count中。我只想要列表中使用最多的单词,这是我通过小组完成的。OrderBy。。。等线,但我很肯定,我已经使这对我自己非常复杂,非常低效。以及添加字典和键值对

   
            var groups =
        from s in FilteredList
        group s by s into g
        // orderby g descending
        select new
        {
            Stuff = g.Key,
            Count = g.Count()

        };
 groups = groups.OrderBy(g => g.Count).Reverse().Take(1);

var dictionary = groups.ToDictionary(g => g.Stuff, g => g.Count);

foreach (KeyValuePair<string, int> kvp in dictionary)
            {   
                Console.WriteLine("Key = {0}, Value = {1}", kvp.Key, kvp.Value);
                
            }
            
请有人帮我解决这个问题,给我解释一下,或者至少给我指出一些学习材料的方向,这可能会帮助我更好地理解这一点

额外信息:FilteredList来自一大块外部文本,读入由分隔符拆分的字符串列表,减去字符串停止字列表

另外,如果这不是lambda函数,或者我这里的任何信息都不正确,请纠正我,这样我就可以修正这个问题,使之更相关&帮助我找到答案

提前感谢。

这应该可以:

var mostPopular = groups
    .GroupBy(item => new {item.Stuff, item.Count})
    .Select(g=> g.OrderByDescending(x=> x.Count).FirstOrDefault())
    .ToList();

OrderByDescending与。首先结合使用OrderBy、Reverse和Take。

第一部分是Linq操作,用于从FilteredList读取组

var groups =
    from s in FilteredList
    group s by s into g
    // orderby g descending
    select new
    {
        Stuff = g.Key,
        Count = g.Count()

    };
Lambda使用在使用=>信号时开始。基本上意味着它将在运行时进行计算,并创建该类型/格式的对象。 代码示例:

groups = groups.OrderBy(g => g.Count).Reverse().Take(1);
读到这里,它将有一个对象“g”,它用属性“Count”表示“groups”上的元素。作为一个列表,它允许应用“反向”,而“Take”只能获取第一个元素

至于文档,最好在堆栈溢出内搜索,请查看以下链接:

-堆栈溢出 -外部的 -外部的
第二步:如果数据来自外部源,并且没有性能问题,那么可以让代码继续重构。需要进行更详细的数据分析,以确保另一种算法能够工作。

是的,我认为您在某种程度上过于复杂了。。假设您的单词列表如下:

var words = new[] { "what's", "the", "most", "most", "most", "mentioned", "word", "word" };
您可以通过以下方式获得提及最多的单词:

words.GroupBy(w => w).OrderByDescending(g => g.Count()).First().Key;
当然,您可能希望将其分配给一个变量,并且您可能希望将其分成多行:

var mostFrequentWord = words
  .GroupBy(w => w)                       //make a list of sublists of words, like a dictionary of word:list<word>
  .OrderByDescending(g => g.Count())     //order by sublist count descending
  .First()                               //take the first list:sublist
  .Key;                                  //take the word 

这将保留一个在运行时对单词进行计数的字典,并且将比LINQ路由更有效,因为它只需要一次单词列表,再加上相关的字典查找,而不是将单词列表转换为子列表,按子列表计数对子列表进行排序,获取第一个列表项

Welcome,这个可以吗?…OrderByg=>g.Count.Reverse.Take1;->。OrderByDowneringG=>g.Count.FirstOrDefault;第二个答案是使用方法链略短的版本:是路要走…@mjwills正确!感谢您指出。为了正确排序列表,这很有效,但是当我在mostPopular{Console.WriteLinei;}中运行foreach var I时,我会收到整个排序列表&而不仅仅是顶部值。我是否错过了获得该值的另一个步骤?另外,我想你不知道如何将值从列表中再次分离出来,好吗?嗨,我很感谢你的解释,现在开始变得更有意义了!然而,我正在努力让你的第一个建议生效。我的列表当前是name FilteredList,其中只有字符串,我已经将您的代码放入其中,如下所示:FilteredList.GroupByw=>w.orderbydegeneratingg=>g.Count.First.Key;我想我没有犯错误吧?我从VS收到一个建议,将所有内容设置为一个字符串变量,然后显示整个有序列表,而不是降序,但是如果降序有效,我只需要得到底部顶部。谢谢。你的FilteredList中只有字符串,就像我的字符串数组中只有字符串一样?如果FilteredList确实是字符串的集合,那么您所写的内容中没有错误。。您只需将操作结果设置为一个变量。。e、 g.var mostFrequentWord=FilteredList.GroupByw=>w.orderbydowningg=>g.Count.First.Key;这就解决了,谢谢!
string[] words = new[] { "what", "is", "the", "most", "most", "most", "mentioned", "word", "word" };

var maxK = "";
var maxV = -1;
var d = new Dictionary<string, int>();
foreach(var w in words){
  if(!d.ContainsKey(w))
    d[w] = 0;
  d[w]++;
  if(d[w] > maxV){
    maxK = w; 
    maxV = d[w];
  }
}
Console.WriteLine(maxK);