我正在尝试解决一个简单的算法,一种特定的方法,它获取当前行,并将其添加到最顶端的行。我知道有很多方法可以解决这个问题,但目前我有一个逐行读取的文本文件。每一行都被转换成一个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,但它们对我来说似乎不是很好用。提前感谢!
发布于 2012-09-10 05:29:21
根据你的结果是否有少量的缺失元素(例如,有超过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);
}https://stackoverflow.com/questions/12343034
复制相似问题