2016-08-15 30 views
1
var newList = data.GroupBy(x => new { x.Symbol }) 
      .Select 
      (
       x => 
       { 
        var subList = x.OrderBy(y => y.Date).ToList(); 

        return subList.Select((y, idx) => new 
        { 
         Symbol = y.Symbol, 
         Close = y.Close, 
         Date = y.Date, 
         /*p = (idx < 1) ? null : subList.Skip(idx - 1) 
          .Take(2).Select(o => o.Close).ToList()*/, 
         Vol = (idx < 1) ? 0 : new DescriptiveStatistics 
          (subList.Skip(idx - 1).Take(2).Select(o => (double)o.Close/(double) 
          subList.ElementAt(idx - 1).Close).ToList()).StandardDeviation, 

        }); 
       } 
      ) 
      .SelectMany(x => x) 
      .ToList(); 

我想创建一个变量p = (idx < 1) ? null : subList.Skip(idx - 1).Take(2).Select(o => o.Close).ToList()具有相同索引的Volidxreturn只是一个临时变量不会出现(但必须使用同步idxVol )。那么在哪里写下这个p或者如何改变语法C#LINQ创建具有动态索引临时变量

回答

1

你可以容纳一个临时变量,就像你已经用subList所做的那样,虽然我没有一个测试结构来构建这样的对象,下面这样应该可以工作。

var newList = data.GroupBy(x => new { x.Symbol }) 
.Select 
(
    x => 
    { 
     var subList = x.OrderBy(y => y.Date).ToList(); 
     return subList.Select((y, idx) => { //return is a function not an object 
      var p = (idx < 1) ? null : subList.Skip(idx - 1).Take(2).Select(o => o.Close).ToList(); //your p 

      return new //this return returns the object definition 
      { 
       Symbol = y.Symbol, 
       Close = y.Close, 
       Date = y.Date, 
       Vol = p == null ? 0 : new DescriptiveStatistics(subList.Skip(idx - 1).Take(2).Select(o => (double)o.Close/(double)subList.ElementAt(idx - 1).Close).ToList()).StandardDeviation, 
      }; 
     }); 
    } 
) 
.SelectMany(x => x) 
.ToList(); 
+0

因此,这可以保证'p'和'Vol'共享相同的'idx'吗?为什么我们不能在'return subList.Select((y,idx)=> {'? – user6703592

+0

)中返回第一个'return'?第一个返回语句是返回一个针对你的'subList'变量的查询,其中''p'变量是基于'subList'中每个项目的'idx'而不是数据 – Nico

+0

我怎样才能在linq中搜索有关这样的双参数'(y,idx)'的函数的相关信息,因为当我使用'orderby(y,idx)=>'我真的想知道相关知识 – user6703592