C#LINQ过滤给定列表

时间:2016-08-17 09:42:02

标签: c# linq tuples

以下是pariListList of Tuple}

 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();

然后如何制作&#39; pairList&#39;每个日期只在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查询中实现这两个步骤吗?

1 个答案:

答案 0 :(得分: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();

为了只保留像你描述的那样在Item1和Item2中有符号的对添加到Where,还检查当前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);

在任何情况下,如果您决定使用查询语法而不是方法语法(如果您更喜欢.Anyjoin选项并不重要),那么您可以{{ 1}}无需添加额外的orderby