c# LINQ用给定的List过滤元组的List
本文关键字:List 元组 过滤 LINQ | 更新日期: 2023-09-27 18:02:40
这是pariList
(它是List 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();
那么如何使'pairList'每个日期只留下wantedCombinations
中选择的对。如
选择{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查询中实现这两个步骤更好吗?
经过一番讨论,这就是答案:
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);
在任何情况下,如果你决定去查询语法而不是方法语法(不要紧,如果你喜欢.Any
或join
选项),你可以然后orderby
而不必添加额外的Select