0

我正在尝试以一种特定的方式解决一个简单的算法,它采用当前行并将其添加到最上面的行。我知道有很多方法可以解决这个问题,但目前我有一个可以逐行读取的文本文件。每一行都转换为一个 sbyte(我使用 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 但它们似乎对我来说并不那么热。提前致谢!

4

1 回答 1

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;

如果您有大量缺失的元素,请使用带有 (index, value) 对的 Dictionary(或 SortedDictionary)。

Dictionary<int, long> items;
if (items.ContainsKey(index))
{ 
  items[key] = value;
}
else
{
  items.Add(index, value);
}
于 2012-09-09T21:29:20.900 回答