2015-06-07 3 views
0

Я пытаюсь сортировать 5 объектов клиента и сортировать их по заказу клиента, сохраняя при этом имя и общую сумму, причитающуюся клиенту. Я не уверен точно, как сортировать с использованием идентификационного номера, сохраняя при этом имя клиента и общее количество, связанное с идентификатором. Должен ли я сделать string[] arrayOfString {}? У меня есть наборы и встает на место, и клиенты сделали.Сортировка массива по id

public class Customer 
{ 

    //Attributes 
    private string firstName; 
    private string lastName; 
    private int idNumber; 
    private double total; 

    //Methods 

    public Customer() { } 
    public Customer(string aFirstName, string aLastName, int aIDNumber, double aTotal) 
    { 
     this.SetFirstName(aFirstName); 
     this.SetLastName(aLastName); 
     this.SetIDNumber(aIDNumber); 
     this.SetTotal(aTotal); 
     Console.WriteLine(this.Display()); 

    } 


    //Set 
    public void SetFirstName(string aFirstName) 
    { 
     this.firstName = aFirstName; 
    } 

    public void SetLastName(string aLastName) 
    { 
     this.lastName = aLastName; 
    } 

    public void SetIDNumber(int aIDNumber) 
    { 
     this.idNumber = aIDNumber; 
    } 

    public void SetTotal(double aTotal) 
    { 
     this.total = aTotal; 
    } 

    //Get 
    public string GetFirstName() 
    { 
     return this.firstName; 
    } 

    public string GetLastName() 
    { 
     return this.lastName; 
    } 

    public int GetIDNumber() 
    { 
     return this.idNumber; 
    } 

    public double GetTotal() 
    { 
     return this.total; 
    } 

    public string Display() 
    { 
     return string.Format("Customer Created\r\n" + 
     "\tName: {0} {1}\r\n" + 
     "\tID: {2}\r\n" + 
     "\tBalence: {3}\r\n", this.GetFirstName(), this.GetLastName(), this.GetIDNumber(), this.GetTotal()); 
    } 
+0

Пожалуйста, покажите ваш код. – Lance

+0

Почему бы вам не поставить свой код в вопросе? –

+0

Зачем нам догадываться, как выглядит ваш код? Мы можем ошибаться и давать неверный ответ. Это потеряло бы наше время и заставит нас меньше думать о вас. –

ответ

-2

Чтобы отсортировать список объектов (клиентов в вашем случае), вы должны реализовать IComparable в своем классе.

exmple класс:

public class Person : IComparable<Person>, IComparable, ICloneable 
    { 
     public int ID { get; set; } 
     public string Name { get; set; } 
     public string LastName { get; set; } 
     public DateTime BirthDate { get; set; } 
     public double Weight { get; set; } 
     public Address Address { get; set; } 

     public int Age 
     { 
      get 
      { 
       TimeSpan ts = DateTime.Now.Subtract(BirthDate); 
       return new DateTime(ts.Ticks).Year - 1; 
      } 
     } 

     public string FullName 
     { 
      get 
      { 
       return string.Format("{0} {1}", LastName, Name).Trim(); 
      } 
     } 



     public override string ToString() 
     { 
      return string.Format("[{0}] - {1}, born at {2:dd/MM/yyyy} ({3} years old), {4:#,##0.00} kg", ID, FullName, BirthDate, Age, Weight); 
     } 

     public override bool Equals(object obj) 
     { 
      if ((obj == null) || (!(obj is Person))) 
       return false; 

      Person other = (Person)obj; 

      return (this.ID == other.ID) && 
       (this.Name == other.Name) && 
       (this.LastName == other.LastName) && 
       (this.BirthDate == other.BirthDate) && 
       (this.Weight == other.Weight); 

     } 

     public override int GetHashCode() 
     { 
      return ID.GetHashCode() * 2 + 
       Name.GetHashCode() * 3 + 
       LastName.GetHashCode() * 4; 
     } 



     #region IComparable<Person> Members 

     public int CompareTo(Person other) 
     { 
      if (other == null) 
       return -1; 

      return this.FullName.CompareTo(other.FullName); 
     } 

     #endregion 

     #region IComparable Members 

     public virtual int CompareTo(object obj) 
     { 
      if ((obj == null) || (!(obj is Person))) 
       return -1; 

      Person other = (Person)obj; 

      return CompareTo(other); 
     } 

     #endregion 

     #region ICloneable Members 

     public virtual object Clone() 
     { 
      return new Person() { ID = this.ID, Name = this.Name, LastName = this.LastName, BirthDate = this.BirthDate, Weight = this.Weight }; 
     } 

     #endregion 
    } 
+1

Никогда не должен никогда реализовывать 'GetHashCode()', который использует значения из свойств чтения/записи. '.GetHashCode()' ** должен ** оставаться неизменным на протяжении всего жизненного цикла объекта, если он используется в любой структуре данных, которая полагается на хэш-код, например 'Dictionary <,>', 'HastSet <>', 'HashTable' , – Enigmativity

1

Попробуйте это:

List<Customer> sortedCustomers = customers.OrderBy(c => c.GetIDNumber()).ToList(); 

Я тоже любопытно, почему вы не реализуете вам класс вроде этого:

public class Customer 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public int IDNumber { get; set; } 
    public double Total { get; set; } 

    public Customer() { } 
    public Customer(string aFirstName, string aLastName, int aIDNumber, double aTotal) 
    { 
     this.FirstName = aFirstName; 
     this.LastName = aLastName; 
     this.IDNumber = aIDNumber; 
     this.Total = aTotal; 
     Console.WriteLine(this.Display()); 
    } 

    public string Display() 
    { 
     return String.Format(
      "Customer Created\r\n\tName: {0} {1}\r\n\tID: {2}\r\n\tBalance: {3}\r\n", 
      this.FirstName, this.LastName, this.IDNumber, this.Total); 
    } 
} 
+0

Эта настройка намного лучше и чище. Я так понял. Спасибо – JOGO

+0

@JOGO да, C# может автоматически реализовать свойства, которые вам не нужно писать всем получателям и сеттерам, как на Java. В верхней строке используется [LINQ] (https://msdn.microsoft.com/en-us/library/bb397926.aspx), что отлично подходит для управления коллекциями. – ryanyuyu

Смежные вопросы