2014-05-20 40 views
0

我有兩個列表,我分配這種方式其中之一:如何在某些條件下在linq查詢中分配兩個列表?

var query = Enumerable.Range(0, 1440).Select((n, index) => 
{ 
    if ((index >= 525 && index <= 544) || (index >= 600 && index <= 749) || (index >= 810 && index <= 1079) || (index >= 1300 && index <= 1439)) 
     return 0; 
    else if (index >= 1080 && index <= 1299) 
     return 1; 
    else if (index >= 545 && index <= 599) 
     return 3; 
    else if (index >= 750 && index <= 809) 
     return 4; 
    else 
     return 2; 
}).ToList(); 

我的第二個名單被命名爲LST2。我想根據我的第一個列表查詢將其分配爲「0」或「1」。因此,如果查詢是「1」或「2」,則lst2的相同索引和先前索引是「0」值,應該是「1」。如果查詢列表是「3」或「4」,則lst2的相同索引和先前的索引是「1」值,應該是「0」。另外,如果查詢的第一個指示符的值爲「3」或「4」,則lst2的相同指示符應爲「0」。例如;

query = {3,3,3,0,0,0,2,2,0,0,0,0,4,4,4,4,0,0,0,0,1,1,1,0,0,2,2,0,0,4,4} 
lst2 = {0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0} 

我該怎麼做?

編輯:如果查詢的任何指數有3或4的值,lst2的同一個指標必須有0值。如果查詢的任何指數具有3或4的值且前面的指數具有0值,則lst2的相同指數必須具有0值。同樣地;如果查詢的任何指數有1或2的值,lst2的相同指數必須有1個值。如果查詢的任何指數具有1或2的值且前面的指數具有0值,則lst2的相同指數必須具有1個值。

+2

該列表中有1440個元素,在您的示例數據('query'和'lst2')中只顯示一段摘錄,是否正確?一般來說,如果指數(+以前的指數)如此重要,LINQ並不是最好的選擇。使用'for'循環。 –

+0

是的。借調。使用for循環,並同時寫入兩個列表。從延遲執行或任何其他方面來看,linq並沒有從中獲得太多好處,所以不需要太依附它。 – Chris

+0

這是正確的。 lst2應該有相同的大小,這是一個摘錄。我怎樣才能說服自己? – 1teamsah

回答

1

的另一種方法,只需要填寫當跟蹤0。性能明智的是最好循環反轉,但我只看到T_D已經這樣做了,所以就前瞻 - >回顧而言,下面基本上是相同的,但是具有其他語法和不同的尾部填充符。

var arr = new int[query.Count]; 
    int cnt = query.Count - 1, toappendindex = -1; 
    Func<int,int,int> getval = (ind, val) => 
    { 
     if (val == 3 || val == 4) return 0; 
     if (val == 2 || val == 1) return 1; 
     if (ind == cnt) return -1; 
     return arr[ind + 1]; 
    }; 
    for (int ind = cnt; ind >= 0; ind--) 
    { 
     if ((arr[ind] = getval(ind,query[ind])) == -1) 
      toappendindex = ind; //only if there are trailing 0's 
    } 
    if (toappendindex > 0) 
     for (; toappendindex < arr.Length; toappendindex++) arr[toappendindex] = arr[toappendindex - 1]; 

    //var lst2 = arr.ToList(); if list is needed instead of array, otherwise arr could be used directly 
1

試着做這個。

 List<int> query = Enumerable.Range(0, 1440).Select((n, index) => 
     { 
      if ((index >= 525 && index <= 544) || (index >= 600 && index <= 749) || (index >= 810 && index <= 1079) || (index >= 1300 && index <= 1439)) 
       return 0; 
      else if (index >= 1080 && index <= 1299) 
       return 1; 
      else if (index >= 545 && index <= 599) 
       return 3; 
      else if (index >= 750 && index <= 809) 
       return 4; 
      else 
       return 2; 
     }).ToList(); 

     Console.WriteLine(string.Concat("{", string.Join(",", query.ToArray()), "}")); 

     List<int> lst2 = Enumerable.Range(0, 1440).Select((n, index) => 
     { 
      if (query[index] == 1 || query[index] == 2) 
       return 1; 
      else if (query[index] == 3 || query[index] == 4) 
       return 0; 
      else 
      { 
       int retval = 1; 
       //look ahead 
       for (int i = index; i < query.Count; i++) 
       { 
        if (query[i] == 1 || query[i] == 2) 
        { 
         break; 
        } 
        if (query[i] == 3 || query[i] == 4) 
        { 
         retval = 0; 
         break; 
        } 
       } 
       return retval; 
      } 
     }).ToList(); 

     Console.WriteLine(string.Concat("{", string.Join(",", lst2.ToArray()), "}")); 

讓我知道這是你在找什麼。如果你喜歡,你可以用List替換List。我只是喜歡它強類型,以便我可以輕鬆地檢查輸出。

+0

謝謝,但這不是我想要的。我已經用更多的細節修正了這個問題。 – 1teamsah

+0

那怎麼樣? – phoenixinobi

+0

我修改了代碼來解釋最後的0。 – phoenixinobi

1

我希望這是你所需要的:

int n = 1440; 
    byte[] query = new byte[n]; 
    byte[] lst2 = new byte[n]; 
    byte mode = 0; 
    bool first = true; 
    for(int index = n-1; index >= 0; index--) 
    { 

     if ((index >= 525 && index <= 544) || (index >= 600 && index <= 749) || (index >= 810 && index <= 1079) || (index >= 1300 && index <= 1439)) 
      query[index] = 0; 
     else if (index >= 1080 && index <= 1299) 
      query[index] = 1; 
     else if (index >= 545 && index <= 599) 
      query[index] = 3; 
     else if (index >= 750 && index <= 809) 
      query[index] = 4; 
     else 
      query[index] = 2; 

     if(query[index] == 3 || query[index] == 4) 
     { 
      mode = 0; 
      lst2[index] = 0; 
     } 
     else if(query[index] == 1 || query[index] == 2) 
     { 
      if(first) 
      { 
       //change ending zeros to 1 
       for(int j=index+1; j < n; j++) 
        lst2[j] = 1; 

       first = false; 
      } 
      mode = 1; 
      lst2[index] = 1; 
     } 
     else 
     { 
      lst2[index] = mode; 
     } 
    } 
+0

感謝您的回答。這有些錯誤地工作。例如;如果查詢= {2,2,2,0,0,0,3,3,0,0,0,0,4,4,4,4,0,0,0,0,1,1,1, 0,0,0,0}則lst2應該是{1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1 ,1,1,1,1,1,1,1,1}。但是這個解決方案的結果是{1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1, 1,0,0,0,0}。可以做什麼? – 1teamsah

+0

我不知道結尾零的規則。只是繼續以前的模式? –

+0

你說得對。事實上;如果查詢的第一個值不是0,那麼lst2的相同索引應該是0.如果查詢的最後一個值是0,那麼lst2的相同索引應該是1.對不起,我想我沒有說這個。 – 1teamsah

相關問題