2012-08-17 83 views
0

我有一個產品類別:我想對列表進行排序,但它不工作

 public class Product 
{ 
    private string firstname; 
    private string lastname; 
    private string email; 

    public Product() 
    { 
    } 

    public Product(string firstname, string lastname, string email) 
    { 
     this.Firstname = firstname; 
     this.Lastname = lastname; 
     this.Email = email; 
    } 

    public string Firstname 
    { 
     get 
     { 
      return firstname; 
     } 
     set 
     { 
      firstname = value; 
     } 
    } 

    public string Lastname 
    { 
     get 
     { 
      return lastname; 
     } 
     set 
     { 
      lastname = value; 
     } 
    } 

    public string Email 
    { 
     get 
     { 
      return email; 
     } 
     set 
     { 
      email = value; 
     } 
    } 

    public virtual string GetDisplayText(string sep) 
    { 
     return Firstname + sep + Lastname + sep + Email; 
    } 

} 

我做出一個更課堂,我做了ICompare

 public class PersonSort : IComparer<Product> 
{ 
    public enum CompareType 
    { 
     Email 
    } 

    private CompareType compareType; 

    public PersonSort(CompareType cType) 
    { 
     this.compareType = cType; 
    } 

    public int Compare(Product x, Product y) 
    { 
     if (x == null) throw new ArgumentNullException("x"); 
     if (y == null) throw new ArgumentNullException("y"); 

     int result; 
     switch (compareType) 
     { 
      case CompareType.Email: 
       return x.Email.CompareTo(y.Email); 
      default: 
       throw new ArgumentNullException("Invalid Compare Type"); 
     } 
    } 
} 

然後我在產品列表級呼叫

 List<Product> person; 

      public void Sort() 
    { 
     person.Sort(new PersonSort(PersonSort.CompareType.Email)); 
    } 

然後,在形成了本方法調用:

 private ProductList products = new ProductList(); 

      private void button4_Click(object sender, EventArgs e) 
    { 
     products.Sort(); 
    } 

,但它告訴我空例外:對象引用不設置到對象的實例** 能否請你幫me.How解決它?

+0

這是怎麼回事?是否有可能你的'電子郵件'值爲空? – 2012-08-17 18:12:20

+0

哪一行?任何堆棧跟蹤? – 2012-08-17 18:13:28

回答

1

List<Product> person;

這哪裏是給定的值?您沒有在代碼中加入person列表並添加項目(或將項目添加到列表中,然後將其分配給person等)。這可能會導致問題。

public int Compare(Product x, Product y) 
{ 
    if (x == null) throw new ArgumentNullException("x"); 
    if (y == null) throw new ArgumentNullException("y"); 

這是一個壞主意,因爲它是IComparer<T>.Compare的文檔,這是正常的空傳遞的一部分,空參數計算爲小於其他任何說法。雖然我不認爲它與List<T>.Sort()一起使用,但它仍然是使用比較器的方法可以依賴於傳入null是安全的。因此:

public int Compare(Product x, Product y) 
{ 
    if(ReferenceEquals(x, y))//either both null or both the same instance 
    return 0; 
    if(x == null) 
    return -1; 
    if(y == null) 
    return 1; 

這可能是相關的。

最後,如果Email場爲null,則可能會引發在

return x.Email.CompareTo(y.Email) 

最好的辦法就是在構造函數和setter代碼,以便它是不可能的,要不會發生。刪除無參數構造函數,向其他構造函數和檢查器添加一個空檢查,以便在拋出異常時創建一個僞造Product而不是稍後的拋出ArgumentNullException

您還可以添加一個檢查到比較器:

if(x.Email == null || y.Email == null) 
    throw new Exception("Cannot compare a user with null email"); 

,不會修復bug,但將幫助您跟蹤下來。

1

根據提供的代碼,person in ProductList未初始化。話雖如此,如果您在問題中包含異常的調用堆棧,您將得到明確的答案。

List<Product> person; 

List<Product> person = new List<Product>(); 
+0

它仍然不起作用,即使它不給我任何錯誤 – user1050667 2012-08-17 18:27:25

+0

這是否解決了NullReferenceException? 「仍然行不通」對我來說並不重要。 – 2012-08-17 19:11:42

3

你有null參考的地方。確保列表已初始化。另外,是否正確設置Product.Email

您可能想用StringComparer來代替。更換

return x.Email.CompareTo(y.Email); 

return StringComparer.Ordinal.Compare(x.Email, y.Email); 
+0

如何傳遞電子郵件中的值,因爲它已經在XML文件中,並且我在Listbox中上傳了這些值,然後我想對該列表進行排序? – user1050667 2012-08-17 18:36:07

+0

@ user1050667,抱歉,但我不明白你的設置。什麼XML文件?通過它在哪裏?什麼列表框?只需提出專門針對單個問題的新問題,並在成功解決特定主題時接受答案。 – Lucero 2012-08-17 23:23:11

相關問題