簡體   English   中英

使用類型轉換在LINQ中進行條件分組和選擇

[英]Conditional Group and Select in LINQ with type conversion

我知道已經有很多問題,但是由於類型轉換(我認為),我仍然無法解決它。

我有一個自定義類的列表,我通常根據用戶選擇按月(mt)或按季度(qr)進行分組。 這很好。 但是,現在我要求允許按Q413和2013年剩余時間進行分組。 Mt和Qr是字符串。 Quartpos是雙精度數,如果只有Q4以季度為單位,其余以幾個月為單位,則等於4。

這是我所擁有的:

List<MyClass> results = classlist
  .GroupBy(a => new { 
                a.rg,
                a.tar,
                a.mt = ((double.Parse(a.qr) < quartpos) ? a.mt : 0),
                a.qr })
  .Select(g => new MyClass { 
               RG = g.Select(a => a.rg).First(),
               tar = g.Select(a => a.tar).First(),
               yr = g.Select(a => a.yr).First(),
               qr = g.Select(a => a.qr).First(),
               mt = g.Select(a => a.mt).First(),
               pp = g.Average(a => double.Parse(a.pp)),
               pi = g.Sum(a => double.Parse(a.pi)),
               cp = g.Average(a => double.Parse(a.cp)),
               ci = g.Sum(a => double.Parse(a.ci)),
               it = g.Sum(a => double.Parse(a.it)),
               to = g.Sum(a => double.Parse(a.to)),
               cnt = g.Select(a => a.dt).Distinct().Count(),
               pdvol = g.Sum(a => (double.Parse(a.pp) <= 1) 
                                  ? 0 
                                  : (double.Parse(a.pi) / double.Parse(a.pp))) })
  .ToList();

這將引發兩個錯誤:

  1. String Int類型轉換-因為mt是字符串,但:0是int

  2. 無效的匿名類型成員聲明。

我完全知道,我必須在select中使用相同的語法,以確保如果按季度分組則選擇季度,而如果按mounths分組則確保月份。

類的定義:

public class Myclass
{
    public string yr;
    public string qr;
    public string mt;
    public string cw;
    public string tar;
    public string RG;
    public double pp;
    public double pi;
    public double cp;
    public double ci;
    public double it;
    public double to;
    public double pd;
    public double cd;
    public double fp;
    public double fi;
    public double fd;
    public int cnt;
    public double pdmw;
    public double pdvol;

}

classlist是所有變量都是字符串的類-直接從csv導入。

我的問題是如何有條件地對月份(mt)進行分組?

a.mt = ((double.Parse(a.qr) < quartpos) ? a.mt : 0)

您不能創建像這樣的匿名類型。 看一下文檔中的語法。

您想要的是:

a.mt

要么

PropertyName = ((double.Parse(a.qr) < quartpos) ? a.mt : 0)

在這一行。

一個不很完美的解決方案,我能想到的是分裂classlist成兩個新的列表以簡單的.select(a => double.Parse(a.qr) < quartpos)然后保持做所有其他的東西從上面的代碼並按月份將list1分組,按季度將list2分組。 這將消除對條件分組的需要。

但是我認為必須有更好的方法。

        public static IEnumerable<EVFile> SmallerQ(this IEnumerable<EVFile> @this, double quarterpos)
    {
        return from ev in @this
               where (double.Parse(ev.qr)<quarterpos)
               select ev;
    }

    public static IEnumerable<EVFile> LargerEqQ(this IEnumerable<EVFile> @this, double quarterpos)
    {
        return from ev in @this
               where (double.Parse(ev.qr) >= quarterpos)
               select ev;
    }

newlist =  classlist.SmallerQ(quarterpos).ToList();

使用這兩種擴展方法,我可以將原始列表一分為二,然后在沒有條件組加入的情況下繼續進行。 這樣就可以了,但是正如我所說的那樣,不是很好。

暫無
暫無

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

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