Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在我创建的类中使用LINQ_C#_Linq - Fatal编程技术网

C# 如何在我创建的类中使用LINQ

C# 如何在我创建的类中使用LINQ,c#,linq,C#,Linq,在这里,我创建了MyList类。我想在课堂上使用LINQ。 在我的班级下面: class ListOfItems<T>: CollectionBase { List<T> list = new List<T>(); public void Add(T car) { list.Add(car); } public void Add(T car, in

在这里,我创建了MyList类。我想在课堂上使用LINQ。 在我的班级下面:

class ListOfItems<T>: CollectionBase
    {
        List<T> list = new List<T>();
        public void Add(T car)
        {
            list.Add(car);
        }

        public void Add(T car, int index)
        {
            list.Insert(index, car);
        }
        public void Remove(int index)
        {
            list.RemoveAt(index);
        }

        public T getCar(int index)
        {
            return (T)list[index];
        }

        public int Count()
        {
            return list.Count;
        }

        public IEnumerable<T> getItems()
        {
            return list;
        }
    }
在我创建了一些Car类的实例之后:

class Car
    {
        public string Model { get; set; }
        public int Age { get; set; }
        public double Volume { get; set; }

        public Car(string model, int age, double volume)
        {
            Model = model;
            Age = age;
            Volume = volume;
        }

        public override string ToString()
        {
            return "Model: " + Model + " Age: " + Age + " Volume: " + Volume; 
        }
    }
Car bmw = new Car("E34", 20, 2.5);
            Car audi = new Car("C5", 18, 2.8);
            Car toyota = new Car("camry", 20, 2.2);

            ListOfItems<Car> cars = new ListOfItems<Car>();
            cars.Add(bmw);
            cars.Add(audi);
            cars.Add(toyota);
carbmw=新车(“E34”,20,2.5);
奥迪轿车=新车(“C5”,18,2.8);
丰田汽车=新车(“凯美瑞”,20,2.2);
ListOfItems cars=新ListOfItems();
汽车。添加(宝马);
汽车。添加(奥迪);
加上(丰田);
我想在这里像这样使用LINQ:

Console.WriteLine((cars.Where<Car>(p => p.Volume >= 2.5)).ToString())
Console.WriteLine((cars.Where(p=>p.Volume>=2.5)).ToString()

我知道我没有实现接口GetEnumerator()。所以我不太明白。我问了我的朋友(谷歌),但他说关于SQL中的LINQ。。。所以我需要解释和建议来解决这个问题。或链接到源。谢谢。

要实现您需要的功能,您必须实现
IEnumerable
以及“CollectionBase”,这应该会有所帮助,
CollectionBase
仅提供
IEnumerable


请参见alos,我建议您添加另一个名为Cars的类,该类实现IEnumerable

 class Cars : IEnumerable<Car>
{
    Car[] cars;
    public Cars(Car[] cars)
    {
        this.cars = cars;
    }

    public IEnumerator<Car> GetEnumerator()
    {
        for (int index = 0; index < cars.Length; index++)
            yield return cars[index];
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}
您可以按如下方式调用LINQ

Console.Writeline(C.SingleOrDefault(c=>c.Model=="Audi").ToString());
更新

下面是该类的通用版本

 class GenericClass<T> : IEnumerable<T>
{
    T[] elements;
    public GenericClass(T[] elements)
    {
        this.elements = elements;
    }

    public IEnumerator<T> GetEnumerator()
    {
        for (int index = 0; index < cars.Length; index++)
            yield return elements[index];
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}
class GenericClass:IEnumerable
{
T[]元素;
公共泛型类(T[]元素)
{
这个元素=元素;
}
公共IEnumerator GetEnumerator()
{
对于(int index=0;index
我会将类定义更改为:

class ListOfItems<T> : CollectionBase, IEnumerable<T> 
{
    public void Add(T car)
    {
        InnerList.Add(car);
    }

    public void Add(T car, int index)
    {
        InnerList.Insert(index, car);
    }
    public void Remove(int index)
    {
        InnerList.RemoveAt(index);
    }

    public T GetCar(int index)
    {
        return (T)InnerList[index];
    }

    public int Count()
    {
        return InnerList.Count;
    }

    public IEnumerable<T> GetItems()
    {
        return InnerList.Cast<T>();
    }

    public IEnumerator<T> GetEnumerator()
    {
        return this.GetItems().GetEnumerator();
    }
}
编辑:

如果您不喜欢
foreach
循环,那么您可以通过执行以下操作来过火:

    Console.WriteLine(cars.Where(c => c.Volume >= 2.5)
                      .Aggregate(new StringBuilder(),
                                (builder, c) => builder.AppendFormat("{0}{1}", c, Environment.NewLine)).ToString());

老实说,我不明白你为什么要使用
CollectionBase
,我会扔掉它,像你那样包装一个
列表
,然后像我展示的那样实现
IEnumerable

谢谢你的建议,但是你的链接不起作用。使用这个链接:我的道歉,修复了链接你的方法很好,但不是为了我的问题。因为我需要实现我自己的列表类型,之后我可以随时添加到列表中(int、string、car、double..)。您的示例仅适用于类“Car”。您可以使用泛型使其可用于任何类型检查我的更新
foreach(var car in cars.Where(c => c.Volume >= 2.5))
{
    Console.WriteLine(car.ToString());
}
    Console.WriteLine(cars.Where(c => c.Volume >= 2.5)
                      .Aggregate(new StringBuilder(),
                                (builder, c) => builder.AppendFormat("{0}{1}", c, Environment.NewLine)).ToString());