C# 在列表中查找最大对象字段值
我有以下课程:C# 在列表中查找最大对象字段值,c#,linq,C#,Linq,我有以下课程: class MyClass{ string field1, field2; } 我的清单包含以下内容: 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")); 我想找到字段1的最频繁值,这种情况下,我有三倍于
class MyClass{
string field1, field2;
}
我的清单包含以下内容:
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"));
我想找到字段1的最频繁值,这种情况下,我有三倍于值1,一倍于值2,一倍于值3,如何获得字段1的最大计数值这种情况下是1?您可以使用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();
我把这句话分成两半,因为我认为它更容易理解和阅读
查看以获取更多信息。如果只有一个field1值的出现次数最多,如OP中的示例所示,则简单的GroupBy后跟OrderByDescending将对您有所帮助
var maxOccuranceItem = list.GroupBy(x => x.field1)
.OrderByDescending(x => x.Count())
.First().Key;
输出
1
1
2
但是,如果有两组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
1
2
在任何一种情况下,正如其他人所提到的,属性都必须是公共的。您可以使用group BYS来查找最大值或计数?@Reniuz,不确定,但我认为OP希望最大值字段1 bun出现,而不是int。如果您有一个项。字段如果所有元素出现的次数相同,该怎么办?