我有以下课程:
class MyClass{
string field1, field2;
}
我有List<MyClass>
,其中包含以下内容:
list.Add(new MyClass("1","1"));
list.Add(new MyClass("1","2"));
list.Add(new MyClass("1","3"));
list.Add(new MyClass("2","2"));
list.Add(new MyClass("3","2"));
我想找到最频繁的值field1
,在这种情况下,我的值是“ 1”的三倍,值是“ 2”的一倍,值是“ 3”的一倍,我该如何获得field1
的最大计数值(本例为“ 1”)?
答案 0 :(得分:6)
您可以为此使用LINQ。
string result = list.GroupBy(entry => entry.field1)
.Max(item => item.Count());
但是您必须至少公开field1
,因为否则您将无法访问它。
您的类MyClass
没有构造器来创建实例,就像您在示例代码中所做的那样;)
如果有多个元素具有相同的条目数,则必须使用类似的内容。
int maxCount = list.GroupBy(entry => entry.Field1)
.OrderByDescending(grouping => grouping.Count())
.First()
.Count();
List<string> result = list.GroupBy(entry => entry.Field1)
.Where(item => item.Count() == maxCount)
.Select(x => x.Key)
.ToList();
我对声明进行了拆分,因为我认为这样更好地理解和阅读。
请查看101 LINQ Samples,以了解更多信息。
答案 1 :(得分:1)
如果只有一个field1值出现的次数最多(如OP中的示例),则简单的GroupBy后跟OrderByDescending会对您有所帮助。
var maxOccuranceItem = list.GroupBy(x => x.field1)
.OrderByDescending(x => x.Count())
.First().Key;
输出
1
但是,如果有两个field1集,且出现次数相同(在平局的情况下),我将使用以下
场景
list.Add(new MyClass("1","2"));
list.Add(new MyClass("1","3"));
list.Add(new MyClass("2","2"));
list.Add(new MyClass("2","2"));
list.Add(new MyClass("3","2"));
多个项目的解决方案,出现次数最多。
var grouped = list.ToLookup(x => x.field1);
var maxOccuranceCount = grouped.Max(x => x.Count());
var maxOccuranceItems = grouped.Where(x => x.Count() == maxOccuranceCount)
.Select(x => x.Key).ToList();
输出
1
2
在任何一种情况下,正如其他人所提到的,该财产都必须是公开的。