2016-08-17 75 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