2012-09-09 39 views
0

我想解決一個簡單的算法一個特定的方式,它需要當前行並將其添加到最頂端的行。我知道有很多方法可以解決這個問題,但目前我有一個逐行讀取的文本文件。每行都轉換爲一個字節(有一定的原因,我爲什麼使用sbyte,但它與我的文章無關,我不會在這裏提及)並添加到列表中。從那裏,該行被倒轉並添加到另一個列表。下面是我爲第一部分的代碼:插入基礎值到一個不存在的索引

 List<List<sbyte>> largeNumbers = new List<List<sbyte>>(); 
     List<string> total = new List<string>(); 
     string bigIntFile = @"C:\Users\Justin\Documents\BigNumbers.txt"; 


     string result; 

     StreamReader streamReader = new StreamReader(bigIntFile); 

     while ((result = streamReader.ReadLine()) != null) 
     { 
      List<sbyte> largeNumber = new List<sbyte>(); 
      for (int i = 0; i < result.Length; i++) 
      { 
       sbyte singleConvertedDigit = Convert.ToSByte(result.Substring(i, 1)); 
       largeNumber.Add(singleConvertedDigit); 
      } 
      largeNumber.Reverse(); 
      largeNumbers.Add(largeNumber); 
     } 

從那裏,我想用存儲,我將在後面使用將我的數字的字符串一個空列表。但是,我希望能夠將數字添加到名爲「total」的新列表中。我將添加到它的數字並不是全部相同的長度,因此我需要檢查索引是否存在於某個位置,如果是,我會將我正在查看的值添加到數字中如果沒有,我需要創建該索引並將其值設置爲0.在嘗試這樣做時,我不斷收到IndexOutOfRange異常(顯然是因爲該索引不存在)。 :

 foreach (var largeNumber in largeNumbers) 
     { 
      int totalIndex = 0; 

      foreach (var digit in largeNumber) 
      { 
       if (total.Count == 0) 
       { 
        total[totalIndex] = digit.ToString(); //Index out of Range exception occurs here 
       } 
       else 
       { 
        total[totalIndex] = (Convert.ToSByte(total[totalIndex]) + digit).ToString(); 
       } 

       totalIndex ++; 
      } 
     } 

我只是處於虧損狀態。關於如何檢查索引是否存在的任何想法;如果它不創建它並將其基礎值設置爲0?這對我來說只是一個有趣的練習,但我正在用這個可愛的索引部分打磚牆。我嘗試過使用SingleOrDefault以及ElementAtOrDefault,但他們似乎沒有爲我工作太熱。提前致謝!

+0

您正在遞增totalIndex每次迭代。這意味着每次迭代你想添加一個額外的項目,對嗎?你可以使用List.Add方法(或者爲什麼不呢?)。 – usr

+0

是的,但我沒有使用「添加」功能我想使用添加並添加這兩個值。邏輯還沒有完全存在,我只需要照顧索引超出範圍的問題,而不是增加 –

+0

與添加我的意思是'total.Add(digit.toString())'。這不正常嗎? – usr

回答

2

根據您的結果是否有少量缺失元素(即缺少超過50%的元素),考慮簡單地向列表中添加0直到您到達必要的索引。如果您關心物品是否丟失,您可以使用可空物品列表(即List<int?>)而不是常規值(List<int>)。

喜歡的東西(非編譯...)樣本:

// List<long> list; int index; long value 
if (index >= list.Count) 
{ 
    list.AddRange(Enumerable.Repeat(0, index-list.Count+1); 
} 
list[index] = value; 

如果您有缺少的元素的顯著數使用詞典(或SortedDictionary)與(指數值)對。

Dictionary<int, long> items; 
if (items.ContainsKey(index)) 
{ 
    items[key] = value; 
} 
else 
{ 
    items.Add(index, value); 
} 
+0

中的對象進一步下降,集合將從0元素開始。假設最大的數字是12345,我們將要添加的列表僅爲45,那麼列表將只有2個元素,例如元素[0]和元素[1]。我將要添加一個0到索引[2](不存在),然後添加「3」的基礎值。 –

+0

@JustinPeterson,我已經添加了樣本...可能帶有足夠的逐個錯誤並且可能無法編譯...但應該可以顯示我的建議。 –

+0

真棒:)我得到它的要點,這給了我一個更好的主意,如何完全接近它。萬分感謝! –

相關問題