C#无法从值(字符串[])获取字典键(字符串)

时间:2018-11-23 01:46:55

标签: c#

我试图在C#中创建一个动物分类系统,在其中指定动物的王国,门,等级,顺序,家庭,属和种,然后程序输出它是什么动物。

我正在使用字典用string animalType, string[] animalAttributes

代表所有动物

要使其正常工作,我需要能够找到给定值的字典键,为此我创建了一个方法,但是我一直遇到索引错误。

我已经浏览了几篇文章,但不幸的是,我找不到任何解决方法。

在此先感谢您的帮助!

我的代码

Animal.cs

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

namespace Challenge_4___Classification
{
    class Animal
    {
        /* Propeties */

        public string AnimalType { get; private set; } = "none";
        private static Dictionary<string, string[]> AnimalDictionary { get; set; } = new Dictionary<string, string[]>();
        public string Kingdom { get; set; }
        public string Phylum { get; set; }
        public string Class { get; set; }
        public string Order { get; set; }
        public string Family { get; set; }
        public string Genus { get; set; }
        public string Species { get; set; }
        public string[] AnimalAttributes { get; set; } = new string[7];

        /****************************************************************************************/

        /* Constructors */

        public Animal(string kingdom, string phylum, string _class, string order, string family, string genus, string species )
        {
            Kingdom = kingdom;
            Phylum = phylum;
            Class = _class;
            Order = order;
            Family = family;
            Genus = genus;
            Species = species;

            SetAnimalAttirbutes();
            AddDomesticAnimals();
        }

        /****************************************************************************************/

        /* Methods */

        public void SetAnimalAttirbutes()
        {
            AnimalAttributes[0] = Kingdom;
            AnimalAttributes[1] = Phylum;
            AnimalAttributes[2] = Class;
            AnimalAttributes[3] = Order;
            AnimalAttributes[4] = Family;
            AnimalAttributes[5] = Genus;
            AnimalAttributes[6] = Species;
        }

        private void AddDomesticAnimals()
        {
            AnimalDictionary.Add("horse", new string[7] { "animalia", "chordata" , "mammalia", "perissodactyla", "equidae", "equus", "ferus" } );
            AnimalDictionary.Add("cow", new string[7] { "animalia", "chordata", "mammalia", "artiodactyla", "bovidae", "bos", "taurus" } );
            AnimalDictionary.Add("sheep", new string[7] { "animallia", "chordata", "mammalia", "artiodactyla", "bovidae", "ovis", "aries" } );
            AnimalDictionary.Add("pig", new string[7] { "animalia", "chordata", "mammalia", "artiodactyla", "suidae", "sus", "scrofa" } );
            AnimalDictionary.Add("dog", new string[7] { "animalia", "chordata", "mammalia", "carnivora", "canidae", "canis", "lupus" } );
            AnimalDictionary.Add("cat", new string[7] { "animalia", "chordata", "mammalia", "carnivora", "felidae", "felis", "silvestris" } );
            AnimalDictionary.Add("lion", new string[7] { "animalia", "chordata", "mammalia", "carnivora", "felidae", "panthera", "leo" } );
            AnimalDictionary.Add("tiger", new string[7] { "animalia", "chordata", "mammalia", "carnivora", "felidae", "panthera", "tigris" });
            /*AnimalDictionary.Add("dolphin", new string[7] { "", "", "", "", "", "", "" } );
            AnimalDictionary.Add("seal", new string[7] { "", "", "", "", "", "", "" } );
            AnimalDictionary.Add("penguin", new string[7] { "", "", "", "", "", "", "" } );
            AnimalDictionary.Add("ostrich", new string[7] { "", "", "", "", "", "", "" } );
            AnimalDictionary.Add("sparrow", new string[7] { "", "", "", "", "", "", "" } );
            AnimalDictionary.Add("spider", new string[7] { "", "", "", "", "", "", "" } );
            AnimalDictionary.Add("ant", new string[7] { "", "", "", "", "", "", "" } );
            AnimalDictionary.Add("bee", new string[7] { "", "", "", "", "", "", "" } );
            AnimalDictionary.Add("wasp", new string[7] { "", "", "", "", "", "", "" } );
            AnimalDictionary.Add("termite", new string[7] { "", "", "", "", "", "", "" } );
            AnimalDictionary.Add("octopus", new string[7] { "", "", "", "", "", "", "" } );
            AnimalDictionary.Add("squid", new string[7] { "", "", "", "", "", "", "" } );*/
        }

        private void AddWhales()
        {
            // Aetiocetidae
                // Aetiocetus
            AnimalDictionary.Add("whale1", new string[7] { "animalia", "chordata", "mammalia", "cetartiodactyla", "aetiocetidae", "aetiocetus", "cotylalveus" } );
            AnimalDictionary.Add("whale2", new string[7] { "animalia", "chordata", "mammalia", "cetartiodactyla", "aetiocetidae", "aetiocetus", "polydentatus" } );
            AnimalDictionary.Add("whale3", new string[7] { "animalia", "chordata", "mammalia", "cetartiodactyla", "aetiocetidae", "aetiocetus", "tomitai" } );
            AnimalDictionary.Add("whale4", new string[7] { "animalia", "chordata", "mammalia", "cetartiodactyla", "aetiocetidae", "aetiocetus", "weltoni" } );
                // Ashorocetus
            AnimalDictionary.Add("whale5", new string[7] { "animalia", "chordata", "mammalia", "cetartiodactyla", "aetiocetidae", "ashorocetus", "eguchii" } );
                // Chonocetus
            AnimalDictionary.Add("whale6", new string[7] { "animalia", "chordata", "mammalia", "cetartiodactyla", "aetiocetidae", "chonocetus", "sookensis" } );
                // Fucaia
            AnimalDictionary.Add("whale7", new string[7] { "animalia", "chordata", "mammalia", "cetartiodactyla", "aetiocetidae", "fucaia", "buelli" } );
            AnimalDictionary.Add("whale8", new string[7] { "animalia", "chordata", "mammalia", "cetartiodactyla", "aetiocetidae", "fucaia", "goedertorum" } );
                // Morawanocetus
            AnimalDictionary.Add("whale9", new string[7] { "animalia", "chordata", "mammalia", "cetartiodactyla", "aetiocetidae", "morawanocetus", "yabukii" } );
        }



        public string GetDictionaryKey(string[] targetValue)
        {
            List<string[]> valuesList = new List<string[]>();
            List<string> keysList = new List<string>();

            var values = AnimalDictionary.Values;
            var keys = AnimalDictionary.Keys;


            foreach (string[] value in values)
            {
                valuesList.Add(value);
            }

            foreach (string key in keys)
            {
                keysList.Add(key);
            }

            int valueIndex = valuesList.IndexOf(targetValue);

            return keysList[valueIndex];
        }

        public void Test()
        {
            if (AnimalDictionary.ContainsValue(AnimalAttributes))
            {
                AnimalType = GetDictionaryKey(AnimalAttributes);
            }
            else
            {
                AnimalType = "none";
            }
        }
    }
}

Program.cs

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

namespace Challenge_4___Classification
{
    class Program
    {
        static void Main(string[] args)
        {
            Animal dog = new Animal("animalia", "chordata", "mammalia", "carnivora", "canidae", "canis", "lupus");

            Console.WriteLine(dog.AnimalType);
            dog.Test();
            Console.WriteLine(dog.AnimalType);
            Console.WriteLine(dog.GetDictionaryKey(dog.AnimalAttributes));
            Console.ReadLine();
        }
    }
}

1 个答案:

答案 0 :(得分:0)

问题在于,您假设此行上的实例相同,但事实并非如此。 targetValue的实例与valuesList中插入的实例不同,即使它们的值相同。

int valueIndex = valuesList.IndexOf(targetValue);

更改为:

public string GetDictionaryKey(string[] targetValue)
{
    List<string[]> valuesList = new List<string[]>();
    List<string> keysList = new List<string>();

    var values = AnimalDictionary.Values;
    var keys = AnimalDictionary.Keys;


    foreach (string[] value in values)
    {
        valuesList.Add(value);
    }

    foreach (string key in keys)
    {
        keysList.Add(key);
    }

    var entry = values.FirstOrDefault(r => r.SequenceEqual(targetValue));

    int valueIndex = valuesList.IndexOf(entry);

    return keysList[valueIndex];
}

请注意,数组是引用类型,而不是基本类型。当您不使用相同的变量实例时,只能在.IndexOf方法上直接使用基本类型。

  

数组是使您可以将多个项目视为   单一集合。 Microsoft®.NET公共语言运行时(CLR)   支持一维数组,多维数组和   锯齿状数组(数组数组)。所有数组类型都是隐式的   派生自System.Array,后者本身派生自System.Object。   这意味着所有数组始终是引用类型,   在托管堆上分配,并且您的应用程序的变量包含一个   引用数组而不是数组本身。

https://msdn.microsoft.com/en-us/library/bb985948.aspx