基于两个属性从列表中检索多个对象

时间:2016-11-06 13:31:32

标签: c# linq

我有一个具有三个属性(名称,严重性和出现次数)的对象列表。我需要检索所有符合最高严重性的名称,然后检索该严重性中最高的名称。

所以给出一个如下列表:

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;的定义在第二个声明中。

2 个答案:

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

}