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

Anu*_*pam 1 c# linq

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

Cat
Dog
Dog
Mouse
Cat
Dog
Mouse
Cat
Elephant
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢!我只是在学习Linq,所以这个问题可能听起来有点愚蠢.

Sel*_*enç 6

你可以你的项目,然后让你想拥有尽可能多的项目这些组:

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)


Dav*_* B. 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();
Run Code Online (Sandbox Code Playgroud)

此外,LINQPad是一个很棒的工具,用于测试LINQ查询和使用不同的语法.我认为如果我没有弄错的话,它甚至会附带预装的例子.