在类的实例上使用[]表示法

时间:2016-05-28 23:18:24

标签: c# arrays

所以我只是想解决这个问题:编写一个控制台应用程序,给出一个类'Countries'。该类必须包含5个元素的数组。确保在此类中编写必要的代码,以便可以在类的实例上使用[]表示法。

我不知道最后一句是什么意思所以我所做的是创建了一个名为'Countries'的类,并使用了ArrayLists和索引器。然而我不知道这是否正确,因为它特别要求一个数组,我觉得这可以用更简单的方式完成(比如删除国家ID和'FirstOrDefault'函数来打印每个国家的名字)

非常感谢您的帮助!

public class CountriesVar
{
    public int CountryId { get; set; }
    public string Name { get; set; }

}

public class Countries
{
    private List<CountriesVar> listCountries;

    public Countries()
    {
        listCountries = new List<CountriesVar>();
        listCountries.Add(new CountriesVar() { CountryId = 1, Name = "China"});
        listCountries.Add(new CountriesVar() { CountryId = 2, Name = "Mexico" });
        listCountries.Add(new CountriesVar() { CountryId = 3, Name = "France" });
        listCountries.Add(new CountriesVar() { CountryId = 4, Name = "Spain" });
        listCountries.Add(new CountriesVar() { CountryId = 5, Name = "Italy" });

    }

    public string this[int countryId]
    {
        get
        {
            return listCountries.FirstOrDefault(lan => lan.CountryId == countryId).Name;
        }
        set
        {
            listCountries.FirstOrDefault(lan => lan.CountryId == countryId).Name = value;
        }
    }

}


class Program
{
    static void Main(string[] args)
    {

        Countries countries = new Countries();

        Console.WriteLine("Name of country with ID = 1: " + countries[1]);
        Console.WriteLine("Name of country with ID = 2: " + countries[2]);
        Console.WriteLine("Name of country with ID = 3: " + countries[3]);
        Console.WriteLine("Name of country with ID = 4: " + countries[4]);
        Console.WriteLine("Name of country with ID = 5: " + countries[5]);
    }
}

2 个答案:

答案 0 :(得分:1)

是的,这个措辞有点混乱

他可能意味着索引器可以用在你的类的实例上,这就是你正在做的事情

不要忘记你的代码

对我来说有点奇怪的是你正在定义一个类然后从不在外部暴露它,可以用int字符串字典做同样的事情,所以可能想要研究一下,但要坚持回答问题

使用字典

如果他们希望您返回一个字符串并让国家/地区ID成为索引器正在处理的事情,那么您的代码就会出现问题,那么有一件事情可以解决问题是使用字典

<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.1">
    <persistence-unit name="JPA_POJO">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <jta-data-source>java:/airlines</jta-data-source>
        <class>com.airline.model.Passenger</class>
        <properties>
            <property name="javax.persistence.jtaDataSource" value="java:/airlines"/>
            <property name="eclipselink.ddl-generation" value="create-or-extend-tables"/>
        </properties>
    </persistence-unit>
</persistence>

这的行为方式不同

这与你的代码不同,但是一些调整会起作用,主要是在尝试访问它之前检查是否存在某些内容,并将异常抛出范围从技术上讲,你的代码抛出了一个空引用异常,我认为这不太直观

head -100000 file.csv > file100k.csv

也可以使用数组

但必须知道国家/地区ID与实际索引一致,否则此方法会中断,因为您使用从1开始的索引,因为国家/地区ID必须通过减去数字来做一个奇怪的事情有一个索引,这对我来说似乎不对,但那可能只是我。

public class Countries
{
    private Dictionary<int,CountriesVar> _dictCountries;

    public Countries()
    {
        _dictCountries = new []{
                     new CountriesVar() { CountryId = 1, Name = "China"},
                     new CountriesVar() { CountryId = 2, Name = "Mexico" },
                     new CountriesVar() { CountryId = 3, Name = "France" },
                     new CountriesVar() { CountryId = 4, Name = "Spain" },
                     new CountriesVar() { CountryId = 5, Name = "Italy" }
        }.ToDictionary(a=>a.CountryId);

    }

    //this seems weird to me, 
    //it makes more sense to me that this would return a Coutnry
    public string this[int countryId]
    {
        get
        {
            return _dictCountries[countryId].Name;
        }
        set
        {
            _dictCountries[countryId].Name = value;
        }
    }

}

TLDR

你基本上做得对,按照提供的代码的方式使用字典或数组来摆脱你的linq语句并提供更有意义的异常。

答案 1 :(得分:0)

您正在正确地执行此操作,他们要求的是向您的班级添加索引器。看起来你已经掌握了他们在谈论的内容。