对对象数组进行排序,其中null是最后一个元素

时间:2018-02-01 14:50:30

标签: c#

我有一个对象数组,我将对象添加到(苏打饮料)中。我现在要构建一个从数组中删除特定对象的方法,我想确保对象始终放在数组中的任何空点之前(将null排序到最后)。

如何最有效地将空值/空点排序到像这样的数组中?

object[] bottleVector = new object[24];

// Constructor within class Sodacrate
class Soda
    {
        //CLASS VARIABLES
        public string name;
        public double price;

        //CLASS CONSTRUCTOR
        public Soda(string _name, double _price)
        {
            name = _name;
            price = _price;
        }
    }
....
// Later in the code
public void add_soda()
{
    //This is where I need help
    bottles.Sort()
}

2 个答案:

答案 0 :(得分:3)

您似乎正在寻找就地排序

如果 vector C ++ ,而不是 C#概念)意味着数组Soda[]然后:

 Soda[] bottles = ...

 //TODO: lamda (left, right) => should return -1, 0 or 1
 // depeding on if left < right, left == right, left > right
 // sample below shows sorting by price
 Array.Sort<Soda>(bottles, (left, right) => left.price.CompareTo(right.price));

如果 vector List<T>那么(首选方式,因为你想删除项目):

 List<Soda> bottles = ...

 //TODO: lamda (left, right) => should return -1, 0 or 1
 // depeding on if left < right, left == right, left > right
 // sample below shows sorting by price
 list.Sort((left, right) => left.price.CompareTo(right.price));

最后,您可以在IComparable<Soda>类中实现Soda 接口(如果您只有一种排序Soda类实例的默认方式):

 public class Soda: IComparable<Soda> {
   ...

   public int CompareTo(Soda other) {
     if (object.ReferenceEquals(this, other))
       return 0;
     else if (null == other)
       return 1;

     //TODO: return -1, 0, 1 depending on if this <=> other
     return price.CompareTo(other.price);
   }
 } 

然后:

 Soda[] bottles = ...

 Array.Sort(bottle);

或(更好的方法):

 List<Soda> bottles = ...

 bottles.Sort();

答案 1 :(得分:2)

我发现您的代码存在很多问题。

  • 数组不是向量。它们是两个完全不同的东西(来自两种完全不同的语言)。如果你想要一个&#34;数组&#34;可以改变大小,在C#中意味着您通常需要List。可以在不知道列表的最终大小的情况下创建列表,可以动态添加列表,这可能是您想要的。您也不必担心它们的添加顺序,因为它只会添加您添加的内容。
  • 您的数组是object的数组,而不是Soda的数组。您始终要指定类型,以便可以访问该类的成员。如果您的List是object类型,则无法在不进行强制转换的情况下访问这些成员。
  • 您的Soda班级正在使用字段而不是属性。您可能希望使用properties
  • 永远不要将double用于货币值this is what decimal is for

下面代码应该

List<Soda> sodaList = new List<Soda>();

// Constructor within class Sodacrate
public class Soda
{
    //CLASS PROPERTIES
    public string Name {get; set;}
    public decimal Price {get; set;}

    //CLASS CONSTRUCTOR
    public Soda(string name, decimal price)
    {
        Name = name;
        Price = price;
    }
}

至于&#34;排序&#34;问题的一个方面。对我来说,它读取你希望你的数组排序,以便当你添加一个项目时,它将它放在数组中的特定位置。如果你使用List<Soda>,你不必担心它插入的位置,因为没有预定义的大小,它只是按你添加它的顺序添加。但是,如果您确实需要按价格或名称排序,则可以轻松利用LINQ并使用OrderBy()

//Orders by Price in ascending order
sodaList = sodaList.OrderBy(x => x.Price);