我有一个具有三个属性(名称,严重性和出现次数)的对象列表。我需要检索所有符合最高严重性的名称,然后检索该严重性中最高的名称。
所以给出一个如下列表:
Name: Sev: Occ:
Foo 3 2
Bar 2 3
Foobar 2 3
我希望能回到Foo。
给出如下列表:
Name: Sev: Occ:
Foo 3 3
Bar 3 3
Foobar 2 4
我希望能回到Foo 和 Bar。
我认为重要的是要注意我只需要返回的名称,并且由于对象列表相对较小,我不关心多个循环...除了每次都会运行表格上的值已更改。
我承认我的linq-fu严重不足。到目前为止,我已尝试使用morelinq并进行两次传递......
List<Offenders> offenderList = new List<Offenders>();
// offenderList.Add appropriate data objects
var offSev = offenderList.MaxBy(x => x.Severity);
var offOcc = offSev.MaxBy(x => x.Occurrence);
我希望有一个列表(offOcc)只有我想要的记录,然后我可以迭代报告的.Names属性。相反,我得到的是一个错误:&#39;罪犯&#39;不包含&#39; MaxBy&#39;的定义在第二个声明中。
答案 0 :(得分:0)
将您的第一个陈述更改为:
var offSev = offenderList.MaxBy(x => x.Severity).ToList();
答案 1 :(得分:0)
简单,试试这个:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
List<Offenders> offenderList = new List<Offenders>() {
new Offenders() { name = "Foo", sev = 3, occ = 3},
new Offenders() { name = "Bar", sev = 3, occ = 3},
new Offenders() { name = "Foobar", sev = 2, occ = 4}
};
var results = offenderList.GroupBy(x => new { x.sev, x.occ }).OrderByDescending(x => x.Key.sev).ThenByDescending(x => x.Key.occ).FirstOrDefault();
Console.WriteLine(string.Join(",",results.Select(x => x.name).ToArray()));
Console.ReadLine();
}
}
public class Offenders
{
public string name { get; set; }
public int sev { get; set; }
public int occ { get; set; }
}
}