我有一个可能包含重复值的列表,我的要求是获取子列表或仅包含重复值的内容.例如,请考虑以下列表
Cat
Dog
Dog
Mouse
Cat
Dog
Mouse
Cat
Elephant
Run Code Online (Sandbox Code Playgroud)
现在我想只提取猫和狗,因为它们每次出现3次.每次3次可能会改变,可能是4次可能是5次或其他.
是否有Linq查询可以帮我提取这个?
谢谢!我只是在学习Linq,所以这个问题可能听起来有点愚蠢.
你可以组你的项目,然后让你想拥有尽可能多的项目这些组:
list.GroupBy(x => x)
.Where(g => g.Count() == 3)
.Select(g => g.Key)
.ToList();
Run Code Online (Sandbox Code Playgroud)
如果您事先不知道计数并且想要列表中最常见的项目,则需要先计算计数:
var groups = list.GroupBy(x => x).ToList();
var count = groups.Max(g => g.Count());
var items = groups.Where(g => g.Count() == count)
.Select(g => g.Key)
.ToList();
Run Code Online (Sandbox Code Playgroud)
我最初通过使用查询语法来学习LINQ,仅仅因为显式命名和缺少lambda运算符(尽管我现在非常喜欢方法语法,并且通常更喜欢它的简洁).将列表中的项目分组,然后选择与您在"where"子句中指定的计数匹配的Key.只需更改"计数"变量即可更改标准(3,4,5,无论您想要什么等)
int count = 3;
var matches = (from item in list
group item by item into itemGroup
where itemGroup.Count() == count
select itemGroup.Key).ToList();
Run Code Online (Sandbox Code Playgroud)
此外,LINQPad是一个很棒的工具,用于测试LINQ查询和使用不同的语法.我认为如果我没有弄错的话,它甚至会附带预装的例子.