【问题标题】:LINQ to Populate a rangeLINQ 填充范围
【发布时间】:2011-02-06 16:41:44
【问题描述】:

我不知道如何使用 LINQ 表达式执行此部分的第二部分(for/foreach),也没有找到任何与 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;
    }
}

提前致谢。


更新: 我用 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 to 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;
}

【问题讨论】:

  • 有些地方不太对劲。 q1 应该是List&lt;int&gt;,那么int 怎么会有RowID 属性呢?
  • ...“行”从何而来?
  • @Jon Skeet:Rowslet 子句引入。
  • 好的,我更新了 OP,因为 q1 不是一个列表,这显然混淆了这个问题。同样由于“=”的工作方式,我的原始帖子使所有行都具有相同的值。

标签: linq foreach range let


【解决方案1】:

Ani 的回答略有不同:

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

区别:

  • 当只有一个选择时,我不关心查询表达式语法
  • 与其使用 Range from 0 然后选择,我认为从 a.RowID 开始会更容易:)

【讨论】:

  • +1:虽然你提到的两个都是真的,但我试图对 OP 的代码进行“字面”转换,尤其是循环。
  • 你说的都对,我有一个类(new { int, object})。现在我收到“NotSupportedException 不支持查询运算符'Range'。消息不支持查询运算符'Range'。”不过,那是在 LinqPad 中。我很快就会在 VS 中设置运行。
  • @Gary:这很奇怪...但是我刚刚注意到您正试图根据您的原始代码从int 获取RowID,所以一定有什么你不是在告诉我们...q1 实际上是一个数据库查询吗?
【解决方案2】:

我认为q1 的类型实际上应该是List&lt;MyRowClass&gt; 或类似的(当然不能是List&lt;int&gt;)。 你可能想要:

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

          }).ToList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-14
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多