我正在尝试以一种特定的方式解决一个简单的算法,它采用当前行并将其添加到最顶行。我知道有很多方法可以解决这个问题,但目前我有一个逐行读取的文本文件。每一行都被转换为一个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,但它们对我来说似乎并不那么热。提前谢谢!
答案 0 :(得分: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;
如果您有大量缺失元素,请使用带有(索引,值)对的Dictionary(或SortedDictionary)。
Dictionary<int, long> items;
if (items.ContainsKey(index))
{
items[key] = value;
}
else
{
items.Add(index, value);
}