2011-08-03 24 views
3

下面的問題出現在代碼中,即DY1 =,DY2 =等位。我不知道會有多少個,所以我需要這樣做動態。如何使用此示例在Linq中動態旋轉

這是我的文本文件:

Product, Origin Year, Development Year, Incremental Value 
Comp, 1992, 1992, 110.0 
Comp, 1992, 1993, 170.0 
Comp, 1993, 1993, 200.0 
Non-Comp, 1990, 1990, 45.2 
Non-Comp, 1990, 1991, 64.8 
Non-Comp, 1990, 1993, 37.0 
Non-Comp, 1991, 1991, 50.0 
Non-Comp, 1991, 1992, 75.0 
Non-Comp, 1991, 1993, 25.0 
Non-Comp, 1992, 1992, 55.0 
Non-Comp, 1992, 1993, 85.0 
Non-Comp, 1993, 1993, 100.0 

這裏是我的代碼(從LinqPad粘貼):

void Main() 
{ 
    using (var reader = new StreamReader("C:\\temp\\ExampleData.txt")) 
    { 
    var products = 
     (from line in reader.Lines() 
     where !line.StartsWith("Product") 
     let parts = line.Split(',') 
     select new {Product=parts[0], Origin_Year=parts[1], Development_Year=parts[2], Incremental_Value=parts[3], DY=int.Parse(parts[2]) - int.Parse(parts[1]) + 1 }).ToList(); 
    products.Dump(); 

    var grps = from p in products 
    group p by new {p.Product, p.Origin_Year} 
    into g 
    select (new { g.Key.Product, g.Key.Origin_Year, 

    DY1 = g.Where(c => c.DY == 1).Select (c => c.Incremental_Value).FirstOrDefault(), 
    DY2 = g.Where(c => c.DY == 2).Select (c => c.Incremental_Value).FirstOrDefault(), 
    DY3 = g.Where(c => c.DY == 3).Select (c => c.Incremental_Value).FirstOrDefault(), 
    DY4 = g.Where(c => c.DY == 4).Select (c => c.Incremental_Value).FirstOrDefault()  
    }); 

    grps.Dump(); 
    } 
} 

}// Temporary hack to enable extension methods 

/// <summary> 
/// Operators for LINQ to Text Files 
/// </summary> 
public static class Extensions 
{ 
    public static IEnumerable<String> Lines(this TextReader source) 
    { 
    String line; 

    if (source == null) 
     throw new ArgumentNullException("source"); 

    while ((line = source.ReadLine()) != null) 
     yield return line; 
    } 

這裏是我的輸出:

Product Origin_Year DY1 DY2 DY3 DY4 
Comp  1992   110.0 170.0 null null 
Comp  1993   200.0 null null null 
Non-Comp 1990   45.2 64.8 null 37.0 
Non-Comp 1991   50.0 75.0 25.0 null 
Non-Comp 1992   55.0 85.0 null null 
Non-Comp 1993   100.0 null null null 

回答

2

盡我所能建議要約是爲每個可能的DY返回一個數組值。

首先將products查詢中的Incremental_Value字段修改爲double(即double.Parse(parts[3]))。

現在創建一個枚舉爲DYS的最大數量:

var dys = Enumerable.Range(1, products.Max(p => p.DY)); 

然後grps查詢看起來是這樣的:

var grps = 
     from p in products 
     group p by new 
     { 
      p.Product, 
      p.Origin_Year, 
     } into g 
     let lookup = g.ToLookup(x => x.DY, x => x.Incremental_Value) 
     select new 
     { 
      g.Key.Product, 
      g.Key.Origin_Year, 
      DYs = dys.Select(x => lookup[x].Sum()).ToArray(), 
     }; 

這是否對你的工作?

+0

你的努力給出了和我已經想到的結果相同的結果,只有更好的結果,即DY坐在它們總是正確長度的適當位置。我得到了一個foreach循環來將結果輸出到一個SQL表中,並且我發現每個數組的嵌套foreach循環都能很好地解決我的問題,並且它已經實現了。謝謝。 – descf