2016-08-17 78 views
1

这里是pariList(这是List of TupleC#LINQ过滤元组的名单给定名单

List<Tuple<dynamic, dynamic>> PairList = new List<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 })} 
    ...... 
    ...... 

而现在,我在一个特殊的日子选择一些对

var wantedCombinations = pairList 
         .Where(pair => pair.Item1.Date == Beginday) 
         .Select(pair => new { Item = pair, Volspread = Math.Abs(pair.Item1.Vol - pair.Item2.Vol) }) 
         .OrderBy(o => o.Volspread) 
         .Take(FirstSelect) 
         .Select(item =>item.Item) 
         .ToList(); 

那么如何使'pairList'只在每个日期离开wantedCombinations中的那些选定对。 e.g

选择{a, b}, {a, c},然后pairList成为

{({ 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 = 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 = 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 = 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 = 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 })} 
    ...... 
    ...... 

而且最好是实现一个Linq查询这两个步骤?

+0

@吉拉德格林,例如,我在2016年2月3日获得了一对({a,2/3/2016},{c,2/3/2016}),({a,2/3/2016},{b,2/3/2016})',那么我希望'pairList'每天只留下一对符号'{a,c},{a,b}'第三个代码。 – user6703592

回答

2

后在聊天这么多的议论就是答案:

var wantedCombinations = pairList.Where(pair => pair.Item1.Date == Beginday) 
           .Select(pair => new { Item = pair, Volspread = Math.Abs(pair.Item1.Vol - pair.Item2.Vol) }) 
           .OrderBy(o => o.Volspread) 
           .Take(FirstSelect) 
           .Select(item =>item.Item); 

pairList = pairList.Where(pair => 
         wantedCompinations.Any(wc => wc.Item1.Symbol == pair.Item1.Symbol && 
                wc.Item2.Symbol == pair.Item2.Symbol)).ToList(); 

为了像你描述添加到Where也进行检查,只保留那些在项目1和项目2的符号对,目前pair是在选项列表:

var wantedCombinations = new List<dynamic> 
{ 
    new { Symbol1 = "a", Symbol2 = "b" }, 
    new { Symbol1 = "a", Symbol2 = "c" } 
}; 

var result = pairList.Where(pair => pair.Item1.Date == Beginday && 
            wantedCombinations.Any(item => item.Symbol1 == pair.Item1.Symbol && 
                 item.Symbol2 == pair.Item2.Symbol)) 
        .Select(pair => new { Item = pair, Volspread = Math.Abs(pair.Item1.Vol - pair.Item2.Vol) }) 
        .OrderBy(o => o.Volspread) 
        .Take(FirstSelect) 
        .Select(item =>item.Item) 
        .ToList(); 

另一种方式可以加入两个列表:

var wantedCombinations = new List<dynamic> 
{ 
    new { Symbol1 = "a", Symbol2 = "b" }, 
    new { Symbol1 = "a", Symbol2 = "c" } 
}; 

var result = (from pair in pairList 
      where pait.Item1.Date.Equals(Beginday) 
      join c in wantedCombinations on new { pair.Item1.Symbol, pair.Item2.Symbol } equls new { c.Symbol1, c.Symbol2 } 
      orderby Math.Abs(pair.Item1.Vol - pair.Item2.Vol) 
      select pair).Take(FirstSelect); 

在anycase如果你决定要查询的语法,而不是方法的语法(如果你喜欢.Anyjoin选项无所谓),你可以再orderby,而无需添加额外的Select

+0

它可能把它们放在一起吗?实际上'从'pairList'获得的wantedCombinations如第二个代码所示。这意味着我首先选择'wantedCombinations'然后过滤'pairList'。 – user6703592

+0

这意味着我首先选择'wantedCombinations'然后过滤'pairList',它不像上面显示的解决方案的后面部分。 – user6703592

+0

对不起,从'pairList'中,第二个代码显示从'pairList'获取'wantedCombinations'。 – user6703592