LINQ для заполнения диапазона - PullRequest
1 голос
/ 06 февраля 2011

Я не могу понять, как сделать вторую часть этого (for / foreach) с выражениями LINQ, и я не нашел подобных примеров с LINQ. rangeDays будет между 5 и 200, а q1 - это список MyClasses, где RowID - от 10000 до 25000, без пробелов.

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;
    }
}

Заранее спасибо.


Обновление: Я запустил это с двумя инструкциями 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 to SQL, кроме оператора Contains». когда я пытаюсь скомпилировать и запустить:

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;
}

Ответы [ 2 ]

2 голосов
/ 06 февраля 2011

Небольшое отклонение от ответа Ани:

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

Отличия:

  • Когда есть только один выбор, я не беспокоюсь о синтаксисе выражения запроса
  • Вместо того, чтобы использовать Range от 0 и затем Select, я подумал, что было бы проще начать с a.RowID:)
0 голосов
/ 06 февраля 2011

Я думаю, тип 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();
...