【发布时间】:2012-09-02 19:24:41
【问题描述】:
我正在尝试以一种特定的方式解决一个简单的算法,它采用当前行并将其添加到最上面的行。我知道有很多方法可以解决这个问题,但目前我有一个可以逐行读取的文本文件。每一行都转换为一个 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 但它们似乎对我来说并不那么热。提前致谢!
【问题讨论】:
-
每次迭代都会增加 totalIndex。这意味着每次迭代您都想添加一个额外的项目,对吗?你可以只使用 List.Add 方法(或者为什么不呢?)。
-
是的,但我没有使用“添加”功能,我想使用加法并添加两个值。逻辑还没有完全到位,我只需要处理索引超出范围的问题,而不是添加
-
添加我的意思是
total.Add(digit.toString())。不行吗? -
是的。我最终做的只是检查我的索引是否大于或等于列表中的项目数,如果是的话,我只是做了 total.Add("0") 来创建一个新索引,这样我就可以添加一个底层在我的代码中进一步向下对象
标签: c# collections foreach outofrangeexception