有条件地将列表项分组

时间:2014-02-07 15:31:21

标签: c# linq list group-by conditional

在下面的代码中,我根据特定属性创建了两个列表,这些列表决定了我所分组的内容。然后我将两个列表连接成一个列表。

    var naFundCodeGroups = (from sar in aidItems      
                            where sar.SuFundCode.Substring(0, 2) != "SA"                                     
                            group sar by sar.NaFundCode into sa
                            select sa).ToList();

    var suFundCodeGroups = (from sar in aidItems
                            where sar.SuFundCode.Substring(0, 2) == "SA"
                            group sar by sar.SuFundCode
                            into sa
                            select sa).ToList();

    var fundCodeGroups = naFundCodeGroups.Concat(suFundCodeGroups).ToList();

有更优雅的方法吗?
例如,在一个语句中以某种方式通过条件制作组。

感谢您提供任何帮助。

1 个答案:

答案 0 :(得分:1)

如果SuFundCode和NaFundCode集之间没有共同的值,那么坚持使用查询理解语法,这应该有效:

var fundCodeGroups = (from sar in aidItems
   group sar by (sar.SuFundCode.Substring(0, 2) == "SA" ?
      sar.SuFundCode : sar.NaFundCode)
   into sa
   select sa).ToList();

或使用更紧凑(在这种情况下更易读,IMO)的流利/ lambda语法:

var fundCodeGroups = aidItems
   .GroupBy(sar => sar.SuFundCode.Substring(0, 2) == "SA" ?
      sar.SuFundCode : sar.NaFundCode)
   .ToList();

否则,其中任何一个都应该有效,尽管只有最后一个返回与原始分组相同的分组:

var fundCodeGroups1 = (from sar in aidItems
   group sar by new { IsSA = sar.SuFundCode.Substring(0, 2) == "SA",
      Code = (sar.SuFundCode.Substring(0, 2) == "SA" ? sar.SuFundCode : sar.NaFundCode) }
   into sa
   select sa).ToList();

var fundCodeGroups2 = aidItems
   .GroupBy(sar => new { IsSA = sar.SuFundCode.Substring(0, 2) == "SA",
      Code = (sar.SuFundCode.Substring(0, 2) == "SA" ? sar.SuFundCode : sar.NaFundCode) })
   .ToList();

var fundCodeGroups3 = aidItems
   .GroupBy(sar => sar.SuFundCode.Substring(0, 2) == "SA")
   .SelectMany(g => g.Key ? g.GroupBy(i => i.SuFundCode) : g.GroupBy(i => i.NaFundCode))
   .ToList();

我不确定这些提供的清晰度或性能是否比原始解决方案更好。