返回列表中重复次数最多的项

20
        List<string> prod = new List<string>();
        prod.Add("dfg");
        prod.Add("dfg");
        prod.Add("ojj");
        prod.Add("dfg");
        prod.Add("e");

在上面的代码中,prod List 中的项目“dfg”重复了三次(最大计数)... 我想要“dfg”作为输出,因为这个项目重复的次数最多。 有人可以帮忙吗?
2个回答

29

虽然不是最高效的方法,但它能够运行:

var maxRepeatedItem = prod.GroupBy(x => x)
                          .OrderByDescending(x => x.Count())
                          .First().Key;

这样更有效率:

var maxRepeatedItem = prod.GroupBy(x => x)
                          .MaxBy(x => x.Count())
                          .First().Key;

但是需要使用MoreLinq的扩展MaxBy

编辑(根据评论):

如果您希望在平局情况下获得所有最大重复元素,则可以尝试以下解决方案:

var grouped = prod.ToLookup(x => x);
var maxRepetitions = grouped.Max(x => x.Count());
var maxRepeatedItems = grouped.Where(x => x.Count() == maxRepetitions)
                              .Select(x => x.Key).ToList(); 

1
恐怕这种方法在出现平局的情况下只会返回第一个结果,即多个键具有最大出现计数。 - Ivan Golović
1
@IvanG:OP没有关于那个方面的具体说明,但是我添加了一个可能的解决方案... - digEmAll
@digEmAll,你能写出这个“min”逻辑吗? - Shift 'n Tab

22

您可以使用LINQ:

string maxRepeated = prod.GroupBy(s => s)
                         .OrderByDescending(s => s.Count())
                         .First().Key;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接