我正试图用一种特定的方式来解决一个简单的算法,它将当前行添加到最上面的行。我知道有很多方法可以解决这个问题,但目前我有一个文本文件可以逐行读取。每一行都被转换成一个sbyte(我使用sbyte是有一定原因的,但它与我的帖子无关,我不会在这里提及它),并添加到列表中。从那里,行被反转并添加到另一个列表中。这是我第一部分的代码:
List<List<sbyte>> largeNumbers = new List<List<sbyte>>();
List<string> total = new List<string>();
string bigIntFile = @"C:UsersJustinDocumentsBigNumbers.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,但它们对我来说似乎不太管用。提前谢谢!
根据结果是否缺少少量元素(即缺少50%以上的元素),考虑简单地将0添加到列表中,直到达到必要的索引。如果您关心项是否丢失,您可以使用可为null的项列表(即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;
如果有大量丢失的元素,请使用Dictionary(或SortedDictionary)和(index,value)对。
Dictionary<int, long> items;
if (items.ContainsKey(index))
{
items[key] = value;
}
else
{
items.Add(index, value);
}