2014-02-10 15 views
-2

我有以下列表:如何使用相同的整體部分刪除數字並保持列表中的第一次出現?

data = [293.0, 293.1, 293.5, 390.0, 390.2, 390.4, 391.4] 

我想刪除具有相同整數部分的值,並將其存儲到二級列表,第一個值存儲到主列表。

結果:

main = [293.0, 390.0, 391.4] 

secondary = [293.1, 293.5, 390.2, 391.4] 

這裏是我的程序:

public static void checkForOverlap(List<double> data) 
    { 

     List<double> main = new List<double>(); 
     List<double> secondary = new List<double>(); 

     //pointer holds the first occured value 
     double pointer; 
     bool firstOccurence = true; 

     pointer = Convert.ToInt32(data[0]); 
     for (int i = 0; i < data.Count; i++) 
     { 


      if ((data[i] - pointer) < 1 && (data[i] - pointer) == 0 && firstOccurence == true) 
      { 

       main.Add(data[i]); 
       firstOccurence = false; 
      } 
      if (data[i] > 1) 
      { 
       pointer = Convert.ToInt32(data[i]); 
       firstOccurence = true; 
      } 
      else { 
       secondary.Add(data[i]);  
      } 
     } 
    } 
+2

究竟是什麼問題?你的代碼有什麼問題? –

+0

如果你的代碼已經工作,這個問題可能屬於http://codereview.stackexchange.com/ –

+0

@ Pierre-LucPineault它只是將數據列表的第一個值添加到主列表中。 –

回答

4

這是很容易使用LINQ做。首先,集團通過全整數部分輸入數據:

var groups = data.GroupBy(f => (int)f); 

那麼你可以簡單的項目從組到您的主要和次要序列:

var main = groups.Select(g => g.First()).ToList(); 
var secondary = groups.SelectMany(g => g.Skip(1)).ToList(); 

這是保證完全按照你描述的工作因爲GroupBy提供了必要的保證(當按照您的數據在輸入中出現的順序進行枚舉時,組中的項目和組中的項目都會出現)。

+1

我會使用'Floor'而不是將其轉換爲'int' - 'double's超出'int'的範圍。 –

+0

你不應該在'secondary'代碼中進行重新組合(你有'groups.GroupBy(...'現在) –

+0

@TimS .:謝謝,對於secondary的分組是一個複製/粘貼錯誤。我傾向於在謹慎的方面出錯 - 最好是默認情況下得到一個例外,而不是冒着進入'雙精度'小於一整個單位的範圍內的風險。當然,所有這些都是理論上的,但它可能會如果它發生在WTF時刻的話,那麼一個例外是無誤的。 – Jon

相關問題