2016-08-16 60 views
1

这里是形式选择组中的所有元素与集团的最小值

Tuple<dynamic, dynamic> pair = new Tuple<dynamic, dynamic>() = 
{({ Symbol = a, Close = 1.0, Date = 2/1/2016, Vol = 0 }, { Symbol = b, Close = 1.6, Date = 2/1/2016, Vol = 0 })} 
{({ Symbol = a, Close = 1.0, Date = 2/1/2016, Vol = 0 }, { Symbol = c, Close = 2.0, Date = 2/1/2016 , Vol = 0 })} 
{({ Symbol = b, Close = 1.6, Date = 2/1/2016, Vol = 0 }, { Symbol = c, Close = 2.0, Date = 2/1/2016, Vol = 0 })} 
{({ Symbol = a, Close = 1.1, Date = 2/2/2016, Vol = 0 }, { Symbol = b, Close = 1.2, Date = 2/2/2016, Vol = 0 })} 
{({ Symbol = a, Close = 1.1, Date = 2/2/2016, Vol = 0 }, { Symbol = c, Close = 2.1, Date = 2/2/2016, Vol = 0 })} 
{({ Symbol = b, Close = 1.2, Date = 2/2/2016, Vol = 0 }, { Symbol = c, Close = 2.1, Date = 2/2/2016, Vol = 0 })} 
{({ Symbol = a, Close = 1.4, Date = 2/3/2016, Vol = 0 }, { Symbol = b, Close = 1.4, Date = 2/3/2016, Vol = 0 })} 
{({ Symbol = a, Close = 1.4, Date = 2/3/2016, Vol = 0 }, { Symbol = c, Close = 1.4, Date = 2/3/2016, Vol = 0 })} 
{({ Symbol = b, Close = 1.4, Date = 2/3/2016, Vol = 0 }, { Symbol = c, Close = 1.4, Date = 2/3/2016, Vol = 0 })} 
{({ Symbol = a, Close = 1.7, Date = 2/4/2016, Vol = 0.214285714285714 }, { Symbol = b, Close = 1.8, Date = 2/4/2016, Vol = 0.218217890235992 })} 
{({ Symbol = a, Close = 1.7, Date = 2/4/2016, Vol = 0.214285714285714 }, { Symbol = c, Close = 2.7, Date = 2/4/2016, Vol = 0.464743364189122 })} 
{({ Symbol = b, Close = 1.8, Date = 2/4/2016, Vol = 0.218217890235992 }, { Symbol = c, Close = 2.7, Date = 2/4/2016, Vol = 0.464743364189122 })} 
{({ Symbol = a, Close = 1.8, Date = 2/5/2016, Vol = 0.122450941145067 }, { Symbol = b, Close = 1.2, Date = 2/5/2016, Vol = 0.169725025739105 })} 
{({ Symbol = a, Close = 1.8, Date = 2/5/2016, Vol = 0.122450941145067 }, { Symbol = c, Close = 1.2, Date = 2/5/2016, Vol = 0.301649178342484 })} 
{({ Symbol = b, Close = 1.2, Date = 2/5/2016, Vol = 0.169725025739105 }, { Symbol = c, Close = 1.2, Date = 2/5/2016, Vol = 0.301649178342484 })} 
    ...... 
    ...... 

我要选择对与Vol最小的抽象(MIN | VOL1 - VOL2 |)后,每天“2016年2月3日“(以前的日期可以默认任何东西) 预期格式如下:

{({ Symbol = a, Close = 1.7, Date = 2/4/2016, Vol = 0.214285714285714 }, { Symbol = b, Close = 1.8, Date = 2/4/2016, Vol = 0.218217890235992 }), Volspread = XXXX} 
    {({ Symbol = b, Close = 1.2, Date = 2/5/2016, Vol = 0.169725025739105 }, { Symbol = c, Close = 1.2, Date = 2/5/2016, Vol = 0.301649178342484 }), Volspread = XXXX} 
    ....... 
    ....... 

这里Volspread分别是刚刚分钟腹肌。

+1

你*有*使用'Tuple'和'dynamic'这里?使整个事情更具语义上的意义将使你的代码更容易遵循,如果没有别的... –

+0

@Jon Skeet也许你可以忽略代码的第一部分,只是作为一个List(但'Tuple'必须存在) – user6703592

+0

而不是忽略它,如果你提供[mcve]会很有帮助 - 并告诉我们你想要达到的目标。 (目前还不清楚您所展示的代码与后面的说明相关。) –

回答

1

对于每个组中的min差异选择项:

var result = pairs 
    .Where(pair => pair.Item1.Date > new DateTime(2016, 2, 3)) 
    .Select(pair => new { Item = pair, Diff = Math.Abs(pair.Item1.Vol - pair.Item2.Vol) }) 
    .GroupBy(pair => pair.Item.Item1.Date) 
    .SelectMany(group => group.Where(item => item.Diff.Equals(group.Min(i => i.Diff))).Select(item => item.Item)) 
    .ToList(); 

而且测试数据:

List<Tuple<dynamic, dynamic>> pairs = new List<Tuple<dynamic, dynamic>> 
{ 
new Tuple<dynamic,dynamic>(new { Symbol = "a", Close = 1.0, Date = new DateTime(2016,2,1), Vol = 0 }, new { Symbol = "b", Close = 1.6, Date = new DateTime(2016,2,1), Vol = 0 }), 
new Tuple<dynamic,dynamic>(new { Symbol = "a", Close = 1.0, Date = new DateTime(2016,2,1), Vol = 0 }, new { Symbol = "c", Close = 2.0, Date = new DateTime(2016, 2, 1), Vol = 0 }), 
new Tuple<dynamic,dynamic>(new { Symbol = "b", Close = 1.6, Date = new DateTime(2016,2,1), Vol = 0 }, new { Symbol = "c", Close = 2.0, Date = new DateTime(2016, 2, 1), Vol = 0 }), 
new Tuple<dynamic,dynamic>(new { Symbol = "a", Close = 1.1, Date = new DateTime(2016,2,2), Vol = 0 }, new { Symbol = "b", Close = 1.2, Date = new DateTime(2016,2,2), Vol = 0 }), 
new Tuple<dynamic,dynamic>(new { Symbol = "a", Close = 1.1, Date = new DateTime(2016,2,2), Vol = 0 }, new { Symbol = "c", Close = 2.1, Date = new DateTime(2016,2,2), Vol = 0 }), 
new Tuple<dynamic,dynamic>(new { Symbol = "b", Close = 1.2, Date = new DateTime(2016,2,2), Vol = 0 }, new { Symbol = "c", Close = 2.1, Date = new DateTime(2016,2,2), Vol = 0 }), 
new Tuple<dynamic,dynamic>(new { Symbol = "a", Close = 1.4, Date = new DateTime(2016,2,3), Vol = 0 }, new { Symbol = "b", Close = 1.4, Date = new DateTime(2016,2,3), Vol = 0 }), 
new Tuple<dynamic,dynamic>(new { Symbol = "a", Close = 1.4, Date = new DateTime(2016,2,3), Vol = 0 }, new { Symbol = "c", Close = 1.4, Date = new DateTime(2016,2,3), Vol = 0 }), 
new Tuple<dynamic,dynamic>(new { Symbol = "b", Close = 1.4, Date = new DateTime(2016,2,3), Vol = 0 }, new { Symbol = "c", Close = 1.4, Date = new DateTime(2016,2,3), Vol = 0 }), 
new Tuple<dynamic,dynamic>(new { Symbol = "a", Close = 1.7, Date = new DateTime(2016,2,4), Vol = 0.214285714285714 }, new { Symbol = "b", Close = 1.8, Date = new DateTime(2016,2,4), Vol = 0.218217890235992 }), 
new Tuple<dynamic,dynamic>(new { Symbol = "a", Close = 1.7, Date = new DateTime(2016,2,4), Vol = 0.214285714285714 }, new { Symbol = "c", Close = 2.7, Date = new DateTime(2016,2,4), Vol = 0.464743364189122 }), 
new Tuple<dynamic,dynamic>(new { Symbol = "b", Close = 1.8, Date = new DateTime(2016,2,4), Vol = 0.218217890235992 }, new { Symbol = "c", Close = 2.7, Date = new DateTime(2016,2,4), Vol = 0.464743364189122 }), 
new Tuple<dynamic,dynamic>(new { Symbol = "a", Close = 1.8, Date = new DateTime(2016,2,5), Vol = 0.122450941145067 }, new { Symbol = "b", Close = 1.2, Date = new DateTime(2016,2,5), Vol = 0.169725025739105 }), 
new Tuple<dynamic,dynamic>(new { Symbol = "a", Close = 1.8, Date = new DateTime(2016,2,5), Vol = 0.122450941145067 }, new { Symbol = "c", Close = 1.2, Date = new DateTime(2016,2,5), Vol = 0.301649178342484 }), 
new Tuple<dynamic,dynamic>(new { Symbol = "b", Close = 1.2, Date = new DateTime(2016,2,5), Vol = 0.169725025739105 }, new { Symbol = "c", Close = 1.2, Date = new DateTime(2016,2,5), Vol = 0.301649178342484 }), 
}; 

编辑之前:

你可以这样做:

//Remove irrelevant records and calculate diff 
var result = pairs 
    .Where(item => item.Item1.Date > new DateTime(2016, 2, 3)) 
    .Select(item => new { Item = item, Diff = Math.Abs(item.Item1.Vol - item.Item2.Vol) }); 

//Find min diff 
var minDiff = result.Min(item => item.Diff); 

//Get only records with min diff 
result = result.Where(item => item.Diff.Equals(minDiff)).ToList(); 

另一种选择是使用MoreLinq的的NuGet库MinBy

+0

对不起,我的意思是每天的分钟,你的代码只是整个一天的最小值? – user6703592

+0

@ user6703592 - 如果你只想从每个组中选择一个项目,那么用'Select'替换'SelectMant',用'FirstOrDefault()'''group'Where'替换Gloria Green的 –

+0

谢谢! – user6703592

0

看一看MoreLinq其中有MinBy。这不正是你所需要的:

allPairs.GroupBy(x => x.first.Date.Date).Select(x => x.MinBy(y => Math.Abs(y.first.Vol - y.second.Vol))); 

并不保证语法错误;-)