我需要基于3列对列表(实际上是数据表,但为了简单)进行分组,其中第一列实际上是整数形式的会计年度的表示。我需要对所有行进行分组:
最终结果组将合并所有连续会计年度1作为服务,将该组开始的第一年合并到它结束的最后一年,同时总结服务和收入。
var list = new List(){
{20002001, 1 , 100.00},
{20012002, .5 , 100.00},
{20022003, 1.0 , 100.00},
{20042005, 1.0 , 50.00},
{20052006, 1.0 , 50.00
};
应该产生结果:
20002001, 1 , 100.00
20012002, 1 , 100.00
20022006, 3 , 200.00
这不是一个清晰可行的例子,但它可能会阐明我正在努力实现的目标:
var test = from r in list
where r.Item("FiscalYear") + 10001 = list.SkipWhile(r2 => !r.Equals(current)).Skip(1).FirstOrDefault(r3 => r3.Item("FiscalYear")) &&
r.Item("Service") = 1 &&
list.SkipWhile(r2 => !r.Equals(current)).Skip(1).FirstOrDefault(r => r.Item("Service") = 1D)
Select New { FiscalYear = $"{r.Item("FiscalYear") % 1000}{I have NO IDEA HOW TO DETERMINE THIS PART}", Service = list.Sum(r => r.Item("FiscalYear"), Earnings = list.Sum(r => r.Item("Earnings"))
假设get next可以从http://www.herlitz.nu/2011/12/01/getting-the-previous-and-next-record-from-list-using-linq/开始工作。但它在我的场景中不起作用。
我考虑过一个我可以做的小组,除非我错过正确的计数,以便将财政年度分组。
答案 0 :(得分:1)
使用https://stackoverflow.com/a/4682163/6137718中描述的功能的GroupAdjacent:
public static class LinqExtensions
{
public static IEnumerable<IEnumerable<T>> GroupAdjacentBy<T>(
this IEnumerable<T> source, Func<T, T, bool> predicate)
{
using (var e = source.GetEnumerator())
{
if (e.MoveNext())
{
var list = new List<T> { e.Current };
var pred = e.Current;
while (e.MoveNext())
{
if (predicate(pred, e.Current))
{
list.Add(e.Current);
}
else
{
yield return list;
list = new List<T> { e.Current };
}
pred = e.Current;
}
yield return list;
}
}
}
}
你想要的结果可以这样得到。请注意,我使用字符串表示年份,但如果需要,可以更改为使用int。使用以下类结构:
class Entry
{
public Entry(string year, double service, double earnings)
{
this.Year = year;
this.Service = service;
this.Earnings = earnings;
}
public string Year;
public double Service;
public double Earnings;
}
你可以通过这样的方式得到你想要的结果:
var result = list.GroupAdjacentBy((x, y) => x.Service == 1 && y.Service == 1).
Select(g => new Entry(
g.First().Year.Substring(0,4) + g.Last().Year.Substring(4,4),
g.Sum(e => e.Service),
g.Sum(e => e.Earnings)));
我的代码示例可以在https://dotnetfiddle.net/RqmYa9找到。
我不确定为什么在您的示例结果中,第二个条目的服务为1而不是0.5。如果您希望所有服务至少为一个,则在选择服务总和时,您可以在查询中执行三元组。