簡體   English   中英

使用LINQ從子列表中選擇最大值

[英]Select Max value from sublist with LINQ

如何編寫LINQ查詢,該查詢將返回“值”類型的行,其中包含“最大日期”和該日期的“最大值”。 它應該是name =“ Correct”的行

我在最后寫了一個查詢,它可以正常工作,只是試圖找到一種正確的方法。

提前致謝

public class MeasurePoint
{
    public int No { get; set; }
    public string Weight { get; set; }
    public List<Values> Vals { get; set; }
}

public class Values
{
    public string Name { get; set; }
    public int Val { get; set; }
    public DateTime Date { get; set; }
}

public static class Test
{
    public static void Calc()
    {
        var mps = new List<MeasurePoint>();

        mps.Add(new MeasurePoint()
        {
            No = 1,
            Vals = new List<Values>()
            {
                new Values(){Date = DateTime.Now.Date.AddDays(1), Name = "testas", Val = 1},
                new Values(){Date = DateTime.Now.Date.AddDays(2), Name = "testas", Val = 5},
                new Values(){Date = DateTime.Now.Date, Name = "testas", Val = 15}
            }});
        mps.Add(new MeasurePoint()
        {
            No = 2,
            Vals = new List<Values>()
            {
                new Values(){Date = DateTime.Now.Date, Name = "testas", Val = 11},
                new Values(){Date = DateTime.Now.Date.AddDays(2), Name = "Correct", Val = 55},
                new Values(){Date = DateTime.Now.Date, Name = "testas", Val = 15}
            }
        });
        mps.Add(new MeasurePoint()
        {
            No = 3,
            Vals = new List<Values>()
            {
                new Values(){Date = DateTime.Now.Date.AddDays(1), Name = "testas", Val = 111},
                new Values(){Date = DateTime.Now.Date.AddDays(2), Name = "testas", Val = 52},
                new Values(){Date = DateTime.Now.Date, Name = "testas", Val = 15}
            }
        });

        mps.Add(new MeasurePoint()
        {
            No = 4,
            Vals = new List<Values>()                      
        });

        var x = mps.ElementAt(0).Vals.Union(mps.ElementAt(1).Vals).Union(mps.ElementAt(2).Vals);
        var z = x.Where(p => p.Date == x.Max(d => d.Date)).MaxBy(t=>t.Val);

        //One more way I've found
        var ttt = mps.SelectMany(p => p.Vals).GroupBy(t=>t.Date).MaxBy(r=>r.Key).MaxBy(g=>g.Val);
    }
var max = mps.SelectMany(x => x.Vals)
    .Aggregate((a, x) => (x.Date > a.Date) ||
                         ((x.Date == a.Date) && (x.Val > a.Val)) ? x : a);

嘗試這個

var result = mps.Where(m => m.Vals.Count > 0)
    .SelectMany(m => m.Vals
        .OrderByDescending(v => v.Date)
        .Take(1), (m, v) => new {m.No, v.Date, v.Name, v.Val});

編輯 -這是一個新版本,因為問題已變得更加明確

var result = mps.Where(m => m.Vals.Count > 0)
    .SelectMany(m => m.Vals)
    .OrderByDescending(v => v.Date)
    .ThenByDescending(v => v.Val).Take(1);

如果它是IObservable<T>的方法,同時GroupBy()返回IEnumerable<T>如何使用調用MaxBy()呢?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM