Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用LINQ查找最常用的单词_C#_Linq - Fatal编程技术网

C# 使用LINQ查找最常用的单词

C# 使用LINQ查找最常用的单词,c#,linq,C#,Linq,我一直在尝试从字符串列表中查找最常用的单词。我试过类似的东西 但问题是它只返回一个单词,但所有这些单词都是最常用的所必需的 例如,如果我们调用以下列表中的LINQ查询: Dubai Karachi Lahore Madrid Dubai Sydney Sharjah Lahore Cairo 这将导致我们: ans:Dubai,Lahore使用分组方式,然后按计数排序: var result = list .GroupBy(s => s) .Where(g=>g.Count

我一直在尝试从字符串列表中查找最常用的单词。我试过类似的东西

但问题是它只返回一个单词,但所有这些单词都是最常用的所必需的

例如,如果我们调用以下列表中的LINQ查询:

Dubai
Karachi
Lahore
Madrid
Dubai
Sydney
Sharjah
Lahore
Cairo
这将导致我们:


ans:Dubai,Lahore

使用分组方式,然后按计数排序:

var result = list
  .GroupBy(s => s)
  .Where(g=>g.Count()>1)
  .OrderByDescending(g => g.Count())
  .Select(g => g.Key);

如果您需要所有重复出现的单词

  List<string> list = new List<string>();
            list.Add("A");
            list.Add("A");
            list.Add("B");
            var most = (from i in list
                        group i by i into grp
                        orderby grp.Count() descending
                        select new { grp.Key, Cnt = grp.Count() }).Where (r=>r.Cnt>1);
List List=新列表();
列表。添加(“A”);
列表。添加(“A”);
列表。添加(“B”);
var most=(从列表中的i开始)
第i组由i分为grp
orderby grp.Count()降序
选择new{grp.Key,Cnt=grp.Count()});

如果要获取几个最常用的单词,可以使用以下方法:

public List<string> GetMostFrequentWords(List<string> list)
{
    var groups = list.GroupBy(x => x).Select(x => new { word = x.Key, Count = x.Count() }).OrderByDescending(x => x.Count);
    if (!groups.Any()) return new List<string>();

    var maxCount = groups.First().Count;

    return groups.Where(x => x.Count == maxCount).Select(x => x.word).OrderBy(x => x).ToList();
}

[TestMethod]
public void Test()
{
    var list = @"Dubai,Karachi,Lahore,Madrid,Dubai,Sydney,Sharjah,Lahore,Cairo".Split(',').ToList();
    var result = GetMostFrequentWords(list);

    Assert.AreEqual(2, result.Count);
    Assert.AreEqual("Dubai", result[0]);
    Assert.AreEqual("Lahore", result[1]);
}
公共列表GetMostFrequentWords(列表)
{
var groups=list.GroupBy(x=>x).Select(x=>new{word=x.Key,Count=x.Count()}).OrderByDescending(x=>x.Count);
如果(!groups.Any())返回新列表();
var maxCount=groups.First().Count;
返回groups.Where(x=>x.Count==maxCount).Select(x=>x.word).OrderBy(x=>x.ToList();
}
[测试方法]
公开无效测试()
{
var list=@“迪拜、卡拉奇、拉合尔、马德里、迪拜、悉尼、沙迦、拉合尔、开罗”。拆分(',).ToList();
var结果=GetMostFrequentWords(列表);
Assert.AreEqual(2,result.Count);
Assert.AreEqual(“迪拜”,结果[0]);
Assert.AreEqual(“拉合尔”,结果[1]);
}

如果您只想
迪拜、拉合尔
(即,仅限出现次数最多的单词,示例中为2):


我相信一定有更好的方法,但有一件事我设法做到了(这可能会帮助你使它更加优化),那就是如下所示

List<string> list = new List<string>();
        list.Add("Dubai");
        list.Add("Sarjah");
        list.Add("Dubai");
        list.Add("Lahor");
        list.Add("Dubai");
        list.Add("Sarjah");
        list.Add("Sarjah");


        int most = list.GroupBy(i => i).OrderByDescending(grp => grp.Count())
            .Select(grp => grp.Count()).First();
        IEnumerable<string> mostVal = list.GroupBy(i => i).OrderByDescending(grp => grp.Count())
            .Where(grp => grp.Count() >= most)
            .Select(grp => grp.Key) ;
List List=新列表();
列表。添加(“迪拜”);
列表。添加(“Sarjah”);
列表。添加(“迪拜”);
列表。添加(“拉合尔”);
列表。添加(“迪拜”);
列表。添加(“Sarjah”);
列表。添加(“Sarjah”);
int most=list.GroupBy(i=>i).OrderByDescending(grp=>grp.Count())
.Select(grp=>grp.Count()).First();
IEnumerable mostVal=list.GroupBy(i=>i).OrderByDescending(grp=>grp.Count())
.Where(grp=>grp.Count()>=most)
.Select(grp=>grp.Key);
这将列出发生频率最高的人员,如果两个条目发生频率相同,则将包括这两个条目


注意,我们不会选择频率超过一次的条目。

只是一个不相关的问题。我们是否可以限制只选择那些存在不止一次的代码?您为解决此问题而编写的代码在哪里?
  // ans: Dubai, Lahore
  Console.Write("ans: " + String.Join(", ", result));
List<string> list = new List<string>();
        list.Add("Dubai");
        list.Add("Sarjah");
        list.Add("Dubai");
        list.Add("Lahor");
        list.Add("Dubai");
        list.Add("Sarjah");
        list.Add("Sarjah");


        int most = list.GroupBy(i => i).OrderByDescending(grp => grp.Count())
            .Select(grp => grp.Count()).First();
        IEnumerable<string> mostVal = list.GroupBy(i => i).OrderByDescending(grp => grp.Count())
            .Where(grp => grp.Count() >= most)
            .Select(grp => grp.Key) ;