2016-11-06 163 views
2

我有一个包含三个属性(名称,严重性和出现次数)的对象列表。我需要检索所有匹配最高严重性的名称,然后检索严重性最高的匹配项。基于两个属性从列表中检索多个对象

所以给出的列表,如:

Name: Sev: Occ: 
Foo  3  2 
Bar  2  3 
Foobar 2  3 

我希望找回富。

给出一个列表,例如:

Name: Sev: Occ: 
Foo  3  3 
Bar  3  3 
Foobar 2  4 

我希望找回富酒吧。

我认为重要的是要注意我只需要返回的名称,并且由于对象列表相对较小,我不关心多个循环...除了每次更改值时都会运行表格。

我承认我的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属性迭代那个报告。相反,我得到的是一个错误:'违者'在第二条语句中不包含'MaxBy'的定义。

回答

0

更改您的第一个语句是:

var offSev = offenderList.MaxBy(x => x.Severity).ToList(); 
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; } 
    } 

} 
相关问题