如何为每个国家/地区创建一个具有属性的类?

时间:2017-01-17 14:29:36

标签: c# .net winforms

在班级的顶部

public class Country
        {
            public string country { get; set; }
        }

以及我如何构建链接

public void ImagesLinks()
        {
            try
            {
                int counter = 0;
                int cnt = 0;
                foreach (string countryCode in countriescodes)
                {
                    imagesUrls.Add(countriesnames[counter]);
                    counter++; 
                    cnt++;
                    for (; cnt < DatesAndTimes.Count(); cnt++)
                    {
                        string imageUrlIrTrue = firstUrlPart + countryCode + secondUrlPart + DatesAndTimes[cnt] + thirdUrlPart + "true";
                        string imageUrlIrFalse = firstUrlPart + countryCode + secondUrlPart + DatesAndTimes[cnt] + thirdUrlPart + "false";
                        imagesUrls.Add(imageUrlIrTrue);
                        imagesUrls.Add(imageUrlIrFalse);
                        if (cnt % 10 == 0)
                            break;
                    }
                }
            }
            catch(Exception err)
            {
                string myerr = err.ToString();
            }
        }

我最终得到的是一个名单和每个名字的链接。 例如,在索引0中,我的名字是:Europe 然后,分机18指数是欧洲的链接

然后下一个名字在索引21:阿尔卑斯山 然后是接下来的18个阿尔卑斯山的indxs

我想要做的是使用Country类,例如我将键入:

国家。 (在点之后我将拥有所有名称的属性欧洲,阿尔卑斯山等等,所以我可以选择其中一个名称)同样如果我将键入例如文件。所以在点之后我会有像创建副本等属性所以当我输入国家时我会把所有国家的名字命名为Europe,Alps .... 然后,如果我将在其中一个名称上循环,它将循环它的18个项目。例如:

For (int i = 0; i < Country.Europe; i++)
{
  // something to do with Country.Europe[i]
}

或者

For (int i = 0; i < Country.Alps; i++)
    {
      // something to do with Country.Alps[i]
    }

所以也许每个名字/国家都应该是自己的名单?

For (int i = 0; i < Country.Europe.Count(); i++)
    {
      // something to do with Country.Europe[i]
    }

但我的想法是,我可以轻松地从属性列表中选择一个名称,当循环遍历名称时,它将循环显示它的18个项目。

2 个答案:

答案 0 :(得分:1)

我把它快速地扔到了一起 - 这是我可能会处理它的方式。我添加了一点,我想你只需要一个班级来处理国家。在任何情况下,你都需要调整你的循环来创建这个结构,所以这不是一个完美的解决方案 - 但它是我如何做到的。您也可以使用linq而不是循环,我更多地将其作为基于类的答案而不是“漂亮”的答案。

namespace classTest
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        World newWorld = new World();

        Continent Europe = new Continent();
        Europe.name = "Europe";

        Country England = new Country();
        England.name = "England";
        List<string> imageUrl = new List<string>();
        imageUrl.Add("url1-England");
        imageUrl.Add("url2-England");
        imageUrl.Add("url3-England");
        England.imageUrls = imageUrl;

        Europe.countries.Add(England);

        newWorld.continents.Add(Europe);

        Country France = new Country();
        France.name = "France";
        imageUrl = new List<string>();
        imageUrl.Add("url1-France");
        imageUrl.Add("url2-France");
        imageUrl.Add("url3-France");
        France.imageUrls = imageUrl;

        Europe.countries.Add(France);
        foreach (Continent continent in newWorld.continents)
        {
            Console.WriteLine(continent.name);
            foreach (Country country in continent.countries)
            {
                Console.WriteLine(country.name);
                foreach(string imageUri in country.imageUrls)
                {
                    Console.WriteLine(imageUri);
                }
            }
        }
    }
}
public class World
{
    public List<Continent> continents;

    public World()
    {
        continents = new List<Continent>();
    }
}
public class Continent
{
    public string name;
    public List<Country> countries { get; set; }

    public Continent()
    {
        name = string.Empty;
        countries = new List<Country>();
    }
}
public class Country
{
    public string name { get; set; }
    public List<string> imageUrls { get; set; }
    public Country()
    {
        name = string.Empty;
        imageUrls = new List<string>();
    }
}
}

答案 1 :(得分:1)

在以下解决方案中,我使用外部包装器Country,它为各大洲的实例提供静态引用(例如Europe)。各大洲实施IEnumerable,因此您可以遍历该大洲的所有国家/地区或使用LINQ过滤它们。

public class CountryData : IEquatable<CountryData>{
    public string Link { get; set; }

    public bool Equals(CountryData other) {
        if (other == null) {
            return false;
        }
        return StringComparer.Ordinal.Equals(Link, other.Link);
    }

    public override int GetHashCode() {
        return Link.GetHashCode();
    }
}

public static class Country {
    public static readonly Europe Europe = new Europe();
}

public class Europe : IEnumerable<CountryData> {
    private List<CountryData> All => new List<CountryData> {
        Austria,
        Belgium
    };

    public CountryData Austria = new CountryData { Link = @"\Country\Austria" };
    public CountryData Belgium = new CountryData { Link = @"\Country\Belgium" };

    IEnumerator<CountryData> IEnumerable<CountryData>.GetEnumerator() {
        return All.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator() {
        return All.GetEnumerator();
    }
}

用法示例:

var austria = Country.Europe.Austria;
var belgium = Country.Europe.Single(c => c.Link.Contains("Belgium"));

foreach (var european in Country.Europe) {
    Console.WriteLine(european.Link);
}

修改

如果您想比较国家/地区,CountryData必须实施IEquatable<CountryData>

用法示例:

var isSame = Country.Europe.Austria == Country.Europe.Belgium;
// isSame is false