在下面的代码中,我根据特定属性创建了两个列表,这些列表决定了我所分组的内容。然后我将两个列表连接成一个列表。
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();
有更优雅的方法吗?
例如,在一个语句中以某种方式通过条件制作组。
感谢您提供任何帮助。
答案 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();
我不确定这些提供的清晰度或性能是否比原始解决方案更好。