如何使用其中一个变量对列表中的类进行排序

时间:2016-03-06 18:27:26

标签: c# winforms

对于我们的练习(使用Windows表单和类),我们被要求创建一个类列表(不同种类的动物,如狗,猫,牛等),并使它们出现在按字母顺序排序的列表框中。为此,我们使用了一个名为AnimalName的变量,它是Animal的名称。现在我想通过AnimalName对这些类进行排序,但我该怎么做呢?这是代码:

4

我知道在foreach声明之后,我必须编写一行代码,从列表框中获取动物的名字,并按字母顺序显示它们。我还想编写一行代码,使用动物的名称按字母顺序存储列表中的类。 (愤怒的乔,拳击手,e.t.c。)。我怎么写呢? 我试过像:

List<NamedAnimal> animalist = new List<NamedAnimal>
{
    new Bear("Angry Joe") { }, new Cat("Snow White") { }, new Chicken("Henifer Aniston") { }, new Cow("Lolita") { }, new Dog("Vigi the loon") { },
    new Duck("Ronald Duck") { }, new Horse("Shadow") { }, new Kangaroo("Boxer") { }, new Moose("Mickey Moose") {}   
};

private void AnimalForm_Load(object sender, EventArgs e)
{
    foreach (NamedAnimal animal in animalist)
    {
        listBoxAnimal.Items.Add(animal.AnimalName);          
    }
}
在foreach语句之后

但是我得到了一个未处理的异常。

如何使用AnimalName ???

按字母顺序对列表中的类进行排序

3 个答案:

答案 0 :(得分:4)

您可以使用OrderByOrderByDescending方法对List<T>进行排序,然后将排序后的列表设置为ListBox的{​​{3}}:

listBoxAnimal.DataSource= animalist.OrderBy(x => x.AnimalName).ToList();
listBoxAnimal.DisplayMember = "AnimalName"

此外,通过将{AnimalName}之类的字段设置为ListBox的{​​{3}},您可以告诉控件将该字段的字段显示为项目文本。

答案 1 :(得分:0)

要对名称进行排序,您可以尝试对Property AnimalName进行排序。此外,您可以使用ListBox属性为DataSource定义数据源。

var animalNameSortedList = animallist.Select(x => x.AnimalName).ToList();
animalNameSortedList.Sort();
listBoxAnimal.DataSource = animalNameSortedList;

答案 2 :(得分:0)

我按照lamda表达式的建议,但他们似乎没有工作。但我确实找到了IComparable的另一种方式,所以我发布它以便每个人都可以有替代方案。

NamedAnimal类是这样的:

class NamedAnimal : Animal, IComparable<NamedAnimal>
{
    public string AnimalName { get; set; }

    public NamedAnimal(): base ()
    {
       //first constructor with the variables inherited from class Animal
    }

    public NamedAnimal() : base()
    {
        //2nd constructor with the variables inherited + the AnimalName
    }

    public virtual string GetNotes()
    {
        return "No notes available";
    }

   public int CompareTo(NamedAnimal otherAnimalName)
    {

        return AnimalName.CompareTo(otherAnimalName.AnimalName);

    }   
}

最后在Form load:

private void AnimalForm_Load(object sender, EventArgs e)
    {
        //solution with multiple inheritance comparer

        animalist.Sort();

        foreach (NamedAnimal animal in animalist)
        {
            listBoxAnimal.Items.Add(animal.AnimalName);

        }

    }

有效!!我根据名字按字母顺序对动物列表进行了分类! 所以除了lamda表达式之外,这将是第二个解决方案。 感谢您的帮助,因为我将来需要您的建议。 您可以将线程标记为已解决。