在列表中查找最大对象字段值

时间:2019-03-27 13:01:39

标签: c# linq

我有以下课程:

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”)?

2 个答案:

答案 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 

在任何一种情况下,正如其他人所提到的,该财产都必须是公开的。