如何通过我班级的2个属性订购列表

时间:2017-09-20 15:51:50

标签: c# list class

对于这个应用程序,我想把动物放入火车。有6种动物。大型食肉动物,中型食肉动物小食肉动物,大型食草动物,中型食草动物和小型食草动物。我想按照确切的顺序将它们放入我的列表中。我该怎么做?

这是我的动物类:

公共bool食肉动物;

 public Size size;

    public Animal(bool carnivore, Enum size)
    {
        this.carnivore = carnivore;
        this.size = (Size) size;
    }

这是我要订购的课程:

public List<Animal> Animals = new List<Animal>();

        public List<Wagon> Wagons = new List<Wagon>();

        public void Arrange()
        {
            Wagon w = new Wagon();
            Wagons.Add(w);
            foreach (Animal animal in Animals.ToList())
            {
                foreach (Wagon wagon in Wagons.ToList())
                {
                    if (wagon.addAnimal(animal))
                    {
                        wagon.addAnimal(animal);
                        Animals.Remove(animal);
                        break;
                    }
                    else
                    {
                        Wagon wag = new Wagon();
                        wag.addAnimal(animal);
                        Animals.Remove(animal);
                        Wagons.Add(wag);
                    }
                }
            }
        }
    }

这是枚举:

public enum Size
    {
        Small = 1,
        Medium = 3,
        Large = 5
    }

我已经找到了一些订单,然后是事物,但它们似乎不起作用。如果我忽略了一个看起来像我的问题,我很抱歉。

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

您可以使用包含非常有用的扩展方法的命名空间System.Linq来处理列表和IEnumerables<T>

要根据需要进行排序,您可以使用:

Animals.OrderBy(a => a.carnivore).ThenBy(a => a.size);

答案 1 :(得分:0)

要通过肉食和大小将动物分成6辆货车,您可以使用LINQ&#39; GroupBy

public void Arrange()
{
    Wagons.AddRange(
            Animals.GroupBy(animal => new {animal.carnivore, animal.size})
                   .Select(g => 
                       {
                           Wagon wagon = new Wagon();
                           foreach(Animal animal in g)
                               wagon.addAnimal(animal);
                           return wagon;
                       }));
}

您可以在投射到货车之前对这些组进行排序:

public void Arrange()
{
    var groupedAnimals = Animals.GroupBy(animal => new {animal.carnivore, animal.size});
    var orderedGroups = groupedAnimals.OrderBy(g => g.carnivore).ThenBy(g => g.size);

    Wagons.AddRange(orderedGroups.Select(g => 
                       {
                           Wagon wagon = new Wagon();
                           foreach(Animal animal in g)
                               wagon.addAnimal(animal);
                           return wagon;
                       }));
}

但正如其他人提到的那样,结果顺序现在取决于size枚举的声明。