在列表C#Linq中仅选择多次出现的值

时间:2015-03-10 03:09:00

标签: c# linq

我有一个可能包含重复值的列表,我的要求是获取子列表或仅包含重复值的内容。例如,请考虑以下列表

Cat
Dog
Dog
Mouse
Cat
Dog
Mouse
Cat
Elephant

现在我想只提取猫和狗,因为它们每次出现3次。每次3次可能会改变,可能是4次可能是5次或其他。

是否有Linq查询可以帮我提取这个?

谢谢!我刚学习Linq,所以这个问题可能听起来有点愚蠢。

2 个答案:

答案 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查询和使用不同的语法。我认为如果我没有弄错的话,它甚至会附带预装的例子。