我试图在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();
}
}
}
答案 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。 这意味着所有数组始终是引用类型, 在托管堆上分配,并且您的应用程序的变量包含一个 引用数组而不是数组本身。