簡體   English   中英

將組函數動態傳遞給 Linq 查詢

[英]Passing a groupfunction to Linq query dynamically

我有一個 linq 查詢,它根據 ID 對列表中的項目進行分組,並對值運行 Min、Max 或 Average 等函數。 請看下面的代碼。

我想要的是能夠動態地將函數 Min、Max 或 Average 等傳遞給這個查詢。 我們如何使用 linq 做這樣的事情?

class ZoneValue
{
    public string Id { get; set; }
    public string Value { get; set; }
}

static void Main(string[] args)
{
    var values = new List<ZoneValue>();

    values.Add(new ZoneValue() { Id = "1000", Value = "33" });
    values.Add(new ZoneValue() { Id = "1000", Value = "87" });
    values.Add(new ZoneValue() { Id = "1000", Value = "29" });
    values.Add(new ZoneValue() { Id = "1000", Value = "14" });
    values.Add(new ZoneValue() { Id = "2000", Value = "67" });
    values.Add(new ZoneValue() { Id = "3000", Value = "33" });
    values.Add(new ZoneValue() { Id = "3000", Value = "15" });
    values.Add(new ZoneValue() { Id = "3000", Value = "17" });
    values.Add(new ZoneValue() { Id = "3000", Value = "67" });
    values.Add(new ZoneValue() { Id = "4000", Value = "54" });
    values.Add(new ZoneValue() { Id = "5000", Value = "18" });

    var result = (from zoneValue in values
                  group zoneValue by zoneValue.Id into groupResult
                  select new ZoneValue
                  {
                      Id = groupResult.Key,
                      Value = groupResult.Min(x => Double.Parse(x.Value)).ToString()
                  }).ToList();
}

只需創建一個Func<T, TResult>類型的變量並將其傳遞給您的查詢:

Func<IGrouping<string, ZoneValue>, Double> func;
if(condition) 
    func = group => group.Min(x => Double.Parse(x.Value));
else if(condition2)
    func = group => group.Max(x => Double.Parse(x.Value));
else
    func = group => group.Average(x => Double.Parse(x.Value));

現在你使用它如下:

var result = (from zoneValue in values
              group zoneValue by zoneValue.Id into groupResult
              select new ZoneValue
              {
                  Id = groupResult.Key,
                  Value = func(groupResult).ToString()
              }).ToList();

暫無
暫無

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

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