List<T> -- Proper Collection to Use for Large Amount of Items?
<p><strong>Edit</strong>: Ok, since it's clear I'm taking the wrong approach with this, I'll explain what I was intending to do. The overall intent is to (as an exercise) verify all valid email addresses according to spec. This portion was to generate a portion of the data-set to verify the algorithm against.</p>

<hr>

<p>As an exercise, I'm writing a program that will generate all possible email addresses. This will result in <strike><sub>80</sub><sup>81<sup>65</sup></sup></strike> ≈ 1.4e122 possible items. I'm currently using <code>List&lt;T&gt;</code>s to store the generated items but my understanding is that it has a maximum capacity of <code>Int32.MaxValue</code>. I'm guessing a proper solution isn't going to involve <code>List</code>s of <code>List</code>s of <code>List</code>s. This is what I have so far.</p>

<pre><code>private void GenerateLocalPart()
{
    List&lt;string&gt; validLocalSymbols = new List&lt;string&gt;()
    {
        ".", "!", "#", "$", "%", "&amp;", "*", "+", "-",
        "/", "^", "_", "`", "{", "|", "}", "~", "\"",
    };
    List&lt;string&gt; validLocalNumbers = new List&lt;string&gt;()
    {
        "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
    };
    List&lt;string&gt; validLocalLowercase = new List&lt;string&gt;()
    {
        "a", "b", "c", "d", "e", "f", "g", "h", "i", "j",
        "k", "l", "m", "n", "o", "p", "q", "r", "s", "t",
        "u", "v", "w", "x", "y", "z",
    };
    List&lt;string&gt; validLocalUppercase = new List&lt;string&gt;()
    {
        "A", "B", "C", "D", "E", "F", "G", "H", "I", "J",
        "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T",
        "U", "V", "W", "X", "Y", "Z",
    };

    List&lt;string&gt; validLocalPartCharacters = new List&lt;string&gt;();
    validLocalPartCharacters.AddRange(validLocalSymbols);
    validLocalPartCharacters.AddRange(validLocalNumbers);
    validLocalPartCharacters.AddRange(validLocalLowercase);
    validLocalPartCharacters.AddRange(validLocalUppercase);

    List&lt;string&gt; targetSequence           = validLocalLowercase;
    int lengthOfStringToGenerate          = 5;
    int numberOfDifferentSourceCharacters = targetSequence.Count;
    List&lt;List&lt;string&gt;&gt; localPart          = new List&lt;List&lt;string&gt;&gt;();
    List&lt;string&gt; localPartSeed            = new List&lt;string&gt;();

    localPart.Add(localPartSeed);
    foreach (string character in targetSequence)
        localPartSeed.Add(character);

    for (int i = 1; i &lt; lengthOfStringToGenerate; i++)
    {
        List&lt;string&gt; bufferList = new List&lt;string&gt;();
        localPart.Add(bufferList);
        foreach (string lastListString in localPart[i - 1])
            foreach (string character in targetSequence)
                bufferList.Add(lastListString + character);
    }

    Console.WriteLine("Break here.");
}
</code></pre>

<p><code>lengthOfStringToGenerate</code> is a maximum length of the strings (so it generates all combinations from 1 to <code>lengthOfStringToGenerate</code>). <code>localPart</code> will end up with an amount of <code>List</code>s equivalent to the <code>lengthOfStringToGenerate</code>. Is there a different type of collection that I should be using? Is there a different overall approach I should be taking?</p>
