0

現在の行を取得して一番上の行に追加する特定の方法で単純なアルゴリズムを解決しようとしています。これを解決する方法はたくさんありますが、現在、行ごとに読み取られるテキスト ファイルがあります。各行は 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);
        }

そこから、後で番号を追加するために使用する文字列を格納する空のリストを使用したいと考えています。ただし、「合計」という名前のこの新しいリストに数値を追加できるようにしたいと考えています。追加する数値はすべて同じ長さではありません。そのため、特定の場所にインデックスが存在するかどうかを確認する必要があるため、存在する場合は、見ている値を数値に追加しますそうでない場合は、そのインデックスを作成し、その値を 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 に設定しない場合は? これは私にとって楽しいエクササイズですが、この素敵なインデックス部分でレンガの壁にぶつかっています. 私は ElementAtOrDefault と同様に SingleOrDefault を使用しようとしましたが、私にとってはそれほどうまく機能していないようです。前もって感謝します!

4

1 に答える 1

2

結果に欠落している要素の数が少ない (つまり、50% 以上の要素が欠落している) かどうかに応じて、必要なインデックスに達するまでリストに 0 を追加することを検討してください。項目が欠落しているかどうかを気にする場合はList<int?>、通常の値 ( ) の代わりにnull 許容項目のリスト (つまり ) を使用できます。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);
}
于 2012-09-09T21:29:20.900 に答える