Ошибка генератора случайных предметов

Итак, в общем, я делаю генератор случайных предметов для классного проекта. Прямо сейчас часть генерации имени не работает, когда она находит 3 или более имен. Ошибка, которую я получаю:

FormatExeption is Unhandled Произошло необработанное исключение типа «System.FormatException» в mscorlib.dll.

Дополнительная информация: индекс (отсчитываемый от нуля) должен быть больше или равен нулю и меньше размера списка аргументов.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication4
{
    class Program
    {
    public static string ID { get; set; }
    public static int Damage { get; set; }
    public static int Defense { get; set; }
    public static string Name;
    public static string Rarity;
    public static int NumberOfNames;
    public static string ItemType;
    public static Random Random = new Random();
    public static List<string> ItemTypeList = new List<string> { "Chest area armor", "Weapon", "Shield", "Head area armor", "Leggings", "Shoes", "Gloves", "Belt", "Ring" };
    public static List<string> WeaponList = new List<string> { "Staff", "Sword", "Dagger", "Wand", "Axe", "Mace" };
    public static List<string> Value1 = new List<string> { "Wooden", "Bronze" };
    public static List<string> Value2 = new List<string> { "Silver", "Steel" };
    public static List<string> Value3 = new List<string> { "Dragon Glass", "Adamantium", "Titanium", "Arcane", };
    public static List<string> ArmorValue = new List<string> { "Cloth", "Leather", "Iron", "Silver", "Steel", "Titanium", "Arcane", "Dragon Glass", "Titanium" };
    public static List<string> Name1 = new List<string> { "Stupid", "Great", "Powerful", "Epic", "Masterfull", "Mighty", "Bountiful", "Foreverlasting", "Pointless", "Useless" };
    public static List<string> Name2 = new List<string> { "Things", "Power", "Proportions", "Torment", "Legs", "Turnament", "Shit", "Crazyness", "Awesomeness" };
    public static List<string> NameLenght3List = new List<string> { "Ragnarok", "Power", "Bondage", "Noobs", "Great Weakness", "Error", "404", "Torture", "SHIT STATS(No idea since I'm not good enough to programm stats based on names)", "The Dark Lord", "Emperor", "Monkey Kong", "I ran out of words", "Blablabla" };

    public static string ItemGenerator(int droprarity)
    {
        int dropRarity = droprarity;
        NumberOfNames = NumberOfNamesGenerator(dropRarity);
        Console.WriteLine(NumberOfNames);
        Rarity = RarityGenerator(dropRarity);
        ItemType = ItemTypeGenerator();
        if (ItemType == "Sword")
        {
            ItemType = WeaponList[Random.Next(0, WeaponList.Count)];
        }
        Name = NameGenerator();
        return Name;

    }
    public static string RarityGenerator(int dropRarity)
    {
        switch (dropRarity)
        {
            case 1:
                Rarity = "Poor";
                break;
            case 2:
                Rarity = "Common";
                break;
            case 3:
                Rarity = "Uncommon";
                break;
            case 4:
                Rarity = "Elite";
                break;
            case 5:
                Rarity = "Rare";
                break;
            case 6:
                Rarity = "Legendary";
                break;
        }

        return Rarity;
    }
    public static string ItemTypeGenerator()
    {
        return string.Format("{0}", ItemTypeList[Random.Next(0, ItemTypeList.Count)]);
    }
    public static int NumberOfNamesGenerator(int dropRarity)
    {
        switch (dropRarity)
        {
            case 1:
                NumberOfNames = 2;
                break;
            case 2:
                NumberOfNames = Random.Next(2, 4);
                break;
            case 3:
                NumberOfNames = Random.Next(2, 4);
                break;
            case 4:
                NumberOfNames = Random.Next(2, 5);
                break;
            case 5:
                NumberOfNames = Random.Next(2, 5);
                break;
            case 6:
                NumberOfNames = Random.Next(2, 6);
                break;
        }
        return NumberOfNames;
    }
    public static string NameGenerator()
    {
        int nameNR = NumberOfNames;
        if (nameNR == 2)
        {
            return string.Format("{0} {1}", Rarity, ItemType);
        }
        else if (nameNR == 3)
        {
            return string.Format("{0} {1} of {3}", Rarity, ItemType, NameLenght3List[Random.Next(0, NameLenght3List.Count)]);
        }
        else if (nameNR == 4)
        {
            return string.Format("{0} {1} of {3} {4}", Rarity, ItemType, Name1[Random.Next(0, Name1.Count)], Name2[Random.Next(0, Name2.Count)]);
        }
        else if (nameNR == 5)
        {
            return string.Format("{0} {1} of {3} {4} {5}", Rarity, ItemType, Name1[Random.Next(0, Name1.Count)], Name1[Random.Next(0, Name1.Count)], Name2[Random.Next(0, Name2.Count)]);
        }
        else if (nameNR == 6)
        {
            return string.Format("{0} {1} of {3} {4} {5} {6}", Rarity, ItemType, Name1[Random.Next(0, Name1.Count)], Name1[Random.Next(0, Name1.Count)], Name1[Random.Next(0, Name1.Count)], Name2[Random.Next(0, Name2.Count)]);
        }
        else
        {
            string ErrorSword = "Error Sword/Armor/blablabla";
            return ErrorSword;
        }
    }
    static void Main(string[] args)
    {
        int number;
        number = Random.Next(1, 6);
        Name = ItemGenerator(number);
        Console.WriteLine(Name);
        Console.ReadLine();;
    }
    }
}

Ошибка возникает при общедоступной статической строке NameGenerator()


person Martin Ringenberg    schedule 05.10.2015    source источник
comment
Просто любопытно, этот код связан с игрой?   -  person Casey    schedule 05.10.2015
comment
Дополнительное примечание: в будущем, прежде чем задавать вопрос, обязательно выполните поиск сообщения об ошибке и предоставьте минимальный код, демонстрирующий проблему (см. минимальный воспроизводимый пример для справки).   -  person Alexei Levenkov    schedule 05.10.2015


Ответы (2)


 else if (nameNR == 3)
    {
        return string.Format("{0} {1} of {3}", Rarity, ItemType, NameLenght3List[Random.Next(0, NameLenght3List.Count)]);
    }
    else if (nameNR == 4)
    {
        return string.Format("{0} {1} of {3} {4}", Rarity, ItemType, Name1[Random.Next(0, Name1.Count)], Name2[Random.Next(0, Name2.Count)]);
    }
    else if (nameNR == 5)
    {
        return string.Format("{0} {1} of {3} {4} {5}", Rarity, ItemType, Name1[Random.Next(0, Name1.Count)], Name1[Random.Next(0, Name1.Count)], Name2[Random.Next(0, Name2.Count)]);
    }
    else if (nameNR == 6)
    {
        return string.Format("{0} {1} of {3} {4} {5} {6}", Rarity, ItemType, Name1[Random.Next(0, Name1.Count)], Name1[Random.Next(0, Name1.Count)], Name1[Random.Next(0, Name1.Count)], Name2[Random.Next(0, Name2.Count)]);
    }

Во всех этих string.Format() методах вы пропускаете {2} и переходите от {1} к {3}, что недопустимо. Изменил их на return string.Format("{0} {1} of {2}..." и так далее.

person PoweredByOrange    schedule 05.10.2015
comment
Ты опередил меня. Чертовски быстро печатающие... лол JK. - person Casey; 05.10.2015
comment
Я чувствую себя таким слепым прямо сейчас, спасибо :) - person Martin Ringenberg; 05.10.2015
comment
Нет проблем. Я пишу корпоративные приложения безопасности и банковские приложения, и меня укусила проблема индекса строкового формата. Иногда мы видим это, потому что это имеет смысл в нашей голове, и третий глаз — это все, что вам нужно. Часть кодирования. :) - person Casey; 05.10.2015
comment
@MartinRingenberg Пожалуйста, отметьте один из ответов как ответ, чтобы закрыть вопрос. Либо мой, либо Кейси, так как они оба были по делу. - person PoweredByOrange; 05.10.2015

Вы пропускаете позицию {2} в формате строки. Я думаю, что это проблема.

Пример:

 return string.Format("{0} {1} of {2}", Rarity, ItemType, NameLenght3List[Random.Next(0, NameLenght3List.Count)]);

Не так, как у вас:

 return string.Format("{0} {1} of {3}", Rarity, ItemType, NameLenght3List[Random.Next(0, NameLenght3List.Count)]);

enter code here

Это имеет смысл, почему это происходит при 3 или более.

person Casey    schedule 05.10.2015
comment
FML спасибо, так пробовал с кодинга, что я уже слепой XD - person Martin Ringenberg; 05.10.2015