2016-04-06 59 views
0

查找連續的行到組對於基於3列的列表(實際上是一個數據表,但是爲了簡單起見),其中第一列真正以整數形式表示財政年度。我需要在所有行組:根據任意

  1. 當前財年的第二列(服務)等於1,
  2. 下財年等於1,並且任何連續財年有1作爲那麼服務

最終的結果組將合併了所有連續的會計年度有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")) 

假設下一步將從http://www.herlitz.nu/2011/12/01/getting-the-previous-and-next-record-from-list-using-linq/工作。但它在我的場景中不起作用。

我已經考慮了一個我可以做的小組,除非我錯過了正確的計算方法來分組會計年度。

回答

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。如果您希望所有服務都至少有一個,那麼當您選擇服務總和時,可以在查詢中執行三元操作。