C# 使用LINQ查找最常用的单词
我一直在尝试从字符串列表中查找最常用的单词。我试过类似的东西 但问题是它只返回一个单词,但所有这些单词都是最常用的所必需的 例如,如果我们调用以下列表中的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
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) ;