将基础值插入到不存在的索引中

时间:2012-09-09 21:13:01

标签: c# collections foreach outofrangeexception

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

1 个答案:

答案 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);
}