1

我的搜索方法有问题。我想在我的集合类中创建一个函数,它可以在我的列表中找到具有特定名称的所有产品(对象),然后按价格对列表进行排序。

但是因为它是通用的,所以我无法“访问”列表中对象中的字段。有人能帮帮我吗?

这是我尝试过的:

public class ProductList<T> : ICollection<T>, IComparer<T>
{
    public List<T> _productList = new List<T>();

    // Some other methods


    // 1. try:
    public void FuncSearch_Name(string search_name, ProductList<Product> ListIn, out ProductList<Product> ListOut)
    {
        ListOut = ListIn.Where(x => x.Name.Equals(search_name)).ToList(); // Here it is complaining about that it cant not implicity convert a generic list to productlist (I dont really understand that)
    }


    // I have also tried like this:
    public void FuncSearch_name(string search_name, ref List<T> ListIn, out List<T> ListOut)
    {
        ListOut = ListIn.Where(x => x.Name.Equals(search_name)).ToList();
        ListOut.OrderByDescending(o => o.Price).ToList(); // Here it can't find Name and Price because "T" not contains them..
    }
}

感谢您的时间。我希望你能理解我的问题并能帮助我。

4

4 回答 4

0

为什么不将 ProductList 限制T为接口(或具体产品)?

public class ProductList : ICollection<IProduct>, IComparer<IProduct>
于 2013-04-25T14:01:30.880 回答
0

好吧,您可以为以下添加额外的约束T

interface IHasName
{
   string Name{get;}
}

因此,编译器会知道如何从 T 中获取名称。但是,您只能为您的类执行此操作。对于不受您控制的类,您可以编写一个实现此接口的包装器。

于 2013-04-25T14:01:59.150 回答
0

好吧,实际上您正在实施IComparer<T>. 这是您用来对T对象进行排序的比较器吗?如果是,您可以将它用于 a List.Sort,它是就地的,不像OrderByDescending

public void FuncSearch_name(string search_name, ref List<T> ListIn, out List<T> ListOut)
{
    ListOut = ListIn.Where(x => x.Name.Equals(search_name)).ToList();
    ListOut.Sort(this);
}

这直接Sort排序ListOut,而OrderByDescending返回一个新的IOrderedEnumerable并且不会改变 ListOut自身。

但是,我认为可能有一个更简单的方法:

public IEnumerable<Product> FindByName(string name)
{
    myProducts.Where(p => p.Name == name).OrderByDescending(p => p.Price);
}

您可以在不实现自己的集合类和IComparer<T>.

于 2013-04-25T14:00:28.607 回答
0

由于您的类是泛型的,并且泛型参数不受限制,T可以是任何东西,因此编译器无法知道您的对象具有Name属性。

看起来您的声明应该是:

public class ProductList<T> : ICollection<T>, IComparer<T> where T: Product
{
    public List<T> _productList = new List<T>();

如果 Product 有子类,或者只是

public class ProductList : ICollection<Product>, IComparer<Product> 
{
    public List<Product> _productList = new List<Product>();

实现一个类型的集合也是不寻常IComparer的。通常这是在一个单独的类中完成的。

仔细查看您的问题,ToList<Product>返回一个List<Product>. 无法将 aList<Product>转换为您的自定义类。由于您没有发布构造函数,我可以看到您可以创建一个新的唯一方法ProductList是逐个添加项目。通常,一个集合类型有一个构造函数,它接受一个集合(通常是一个简单的IEnumerable)来初始化它。

无论哪种方式,您的集合类型似乎都做了很多事情,而您尝试实现的方法却没有;根本不与类成员交互。

于 2013-04-25T14:01:00.417 回答