2011-02-06 174 views
1

我無法弄清楚如何用LINQ表達式來完成這個(for/foreach)的第二部分,並沒有找到任何與LINQ相似的例子。 rangeDays將在5到200之間,q1是MyClasses的列表,其中RowID大約在10000到25000之間,沒有間隙。LINQ到填充範圍

public class MyClass { public int RowID; public object otherData; } 

PopulateRange(int rangeDays, List<MyClass> q1){ 
var q2 = (from a in q1 
     let Rows = new int[rangeDays] 
     select new {a.RowID, Rows }).ToList(); 
foreach(var a in q2) 
{ 
    for(int i = 0; i < rangeDays; i++) 
    { 
     a.Rows[i] = a.RowID + i; 
    } 
} 

在此先感謝。


更新: 我這2個LINQ語句運行,如下圖所示(希望這是所有可運行的這段時間)。

public List<MyClass> PopulateRange(int rangeDays, IQueryable<TheirClass> q1) 
{ 
    var q2 = (from a in q1 
       select new MyClass() 
       { RowID = a.RowID, Rows = new int[rangeDays] }).ToList(); 
    q2.ForEach(a => a.Rows = Enumerable.Range(0, rangeDays). 
       Select(i => i + a.RowID).ToArray()); 
    return q2; 
} 
public class MyClass 
{ 
    public int RowID; 
    public int[] Rows; 
} 
public class TheirClass 
{ 
    public int RowID; 
    public int ID; 
    public string Symb; 
    public DateTime? EventTime; 
    public decimal? Value; 
} 

這是可以接受的,但沒有人知道爲什麼下面單個語句引發NotSupportedException「本地序列不能在LINQ用於查詢操作的SQL實現除包含運營商。」當我嘗試編譯&運行:

public List<MyClass> PopulateRange(int rangeDays, IQueryable<TheirClass> q1) 
{ 
    var q2 = (from a in q1 
       select new MyClass() 
     { RowID = a.RowID, Rows = Enumerable.Range(0, rangeDays). 
     Select(i => i + a.RowID).ToArray() }).ToList(); 
    return q2; 
} 
+1

東西不太對。 `q1`應該是`List `,那麼'int`如何具有`RowID`屬性? – Gabe 2011-02-06 16:50:43

+0

......「行」從哪裏來? – 2011-02-06 17:01:20

回答

0

我覺得q1的類型實際上應該是List<MyRowClass>或類似的(這當然不能是List<int>)。 你可能想:

var q2 = (from a in q1 
      select new 
      { 
       a.RowID, 
       Rows = Enumerable.Range(0, rangeDays) 
           .Select(i => i + a.RowID) 
           .ToArray() 

      }).ToList(); 
2

在安仁的回答略有變化:

var q2 = q1.Select(a => new { Rows = Enumerable.Range(a.RowID, rangeDays) 
               .ToArray(), 
           RowID = a.RowID }); 

差異:

  • 當有隻是一個單一的選擇,我不查詢表達式語法打擾
  • 而不是使用範圍從0,然後選擇,我覺得它會更容易,只需從a.RowID開始:)