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");
        }
    }
}

然后我调用 ProductList 类

        List<Product> person;

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

然后在 Form 中调用这个方法:

       private ProductList products = new ProductList();

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

但它显示空异常:对象引用未设置为对象的实例。** 你能帮帮我吗?如何解决?

4

3 回答 3

3

null您在某处有参考。确保列表已初始化。还有,Product.Email设置正确吗?

您可能想StringComparer改用。代替

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

return StringComparer.Ordinal.Compare(x.Email, y.Email);
于 2012-08-17T18:14:00.363 回答
1

根据提供的代码,personinProductList未初始化。话虽如此,如果您在问题中包含异常的调用堆栈,您将得到明确的答案。

List<Product> person;

List<Product> person = new List<Product>();
于 2012-08-17T18:12:18.927 回答
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可以传入 null,并且 null 参数的计算结果低于任何其他参数。虽然我不认为它与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字段为空,它可能会抛出

return x.Email.CompareTo(y.Email)

最好的办法是在构造函数和设置器中包含代码,这样就不可能发生这种情况。删除无参数构造函数,向另一个构造函数和检查器添加一个空检查,以便它ArgumentNullException在某些东西创建虚假Product而不是稍后抛出。

您还可以向比较器添加检查:

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

这不会修复错误,但会帮助您追踪它。

于 2012-08-17T19:30:15.420 回答