我有一个可能包含重复值的列表,我的要求是获取子列表或仅包含重复值的内容。例如,请考虑以下列表
Cat
Dog
Dog
Mouse
Cat
Dog
Mouse
Cat
Elephant
现在我想只提取猫和狗,因为它们每次出现3次。每次3次可能会改变,可能是4次可能是5次或其他。
是否有Linq查询可以帮我提取这个?
谢谢!我刚学习Linq,所以这个问题可能听起来有点愚蠢。
答案 0 :(得分:6)
您可以分组您的项目,然后获取包含任意数量项目的群组:
list.GroupBy(x => x)
.Where(g => g.Count() == 3)
.Select(g => g.Key)
.ToList();
如果您事先不知道计数,并且您想要列表中最常见的项目,则需要先计算:
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();
答案 1 :(得分:5)
我最初通过使用查询语法学习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();
此外,LINQPad是一个很棒的工具,用于测试LINQ查询和使用不同的语法。我认为如果我没有弄错的话,它甚至会附带预装的例子。