带有类型转换的LINQ中的条件组和选择

时间:2013-08-16 08:16:54

标签: c# linq

我知道有很多问题已经存在,但由于类型转换(我认为),我仍然无法让它工作。

我有一个自定义类列表,我通常按月(mt)或按季度(qr)对此进行分组,具体取决于用户的选择。这很好用。但是,现在我要求允许按照Q413和2013年剩余时间进行分组。 Mt和Qr是字符串。如果只有Q4是四分之一并且在几个月内休息,则Quartpos是双倍且等于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. 无效的匿名类型成员声明。

  3. 我完全清楚我必须在选择中使用相同的语法,以确保如果按季度和月份分组,如果按照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 import。

    我的问题是如何有条件地对月份(mt)进行分组?

2 个答案:

答案 0 :(得分:1)

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

您无法像这样创建匿名类型。请查看documentation

中的语法

你要么:

a.mt

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

在这一行。

答案 1 :(得分: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();

使用这两种扩展方法,我可以将原始列表拆分为两个,然后在没有条件组连接的情况下继续。所以它完成了这项工作,但事实并非如此。