在LINQ查询中找不到

时间:2018-11-06 19:24:54

标签: c# list linq

我正在尝试编写一个程序,该程序从.csv文件中获取汽车详细信息,然后将每个汽车的特定详细信息添加到列表对象中。

我在使用LINQ查询来查找列表中所有具有特定CITROEN值的汽车时遇到麻烦。

这给了我错误:

  

找不到源类型“ CarList”的查询模式的实现。 “在哪里”。

在我的foreach上也这样说:

  

foreach语句不能对类型为'?'的变量进行操作因为“?”不包含“ GetEnumerator”的公共实例定义

我在做什么错。我已关注有关如何使用LINQ的Microsoft页面,但我不理解该错误。

这是我的程序类:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LinqPractical
{
    class Program
    {
        static CarList carList = new CarList();

        static void Main(string[] args)
        {
            Car car = new Car();

            StreamReader reader = new StreamReader(File.OpenRead(@"F:\\motfailures.csv"));
            string header = reader.ReadLine();

            while (!reader.EndOfStream)
            {
                string line = reader.ReadLine();
                var values = line.Split(',');

                car.Make = values[0];
                car.Model = values[1];
                car.Year = values[2];
                car.Pass = values[3];
                car.Fail = values[4];

                carList.Add(car);

                Console.WriteLine("Added car to list with details:");
                Console.WriteLine("Make: " + values[0]);
                Console.WriteLine("Model: " + values[1]);
                Console.WriteLine("Year: " + values[2]);
                Console.WriteLine("Pass: " + values[3]);
                Console.WriteLine("Fail: " + values[4]);
            }
            Console.ReadKey();

            ShowMake();
        }

        public static void ShowMake()
        {

            var query = from car in carList
                           where car.Make == "CITROEN"
                           select car;

            foreach (Car c in query)
            {
                Console.WriteLine("Make: " + c.Make + " Model: " + c.Model + " Year: " + c.Year);
            }
        }
    }
}

列表类别:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LinqPractical
{
    class CarList
    {
        private List<Car> _list = new List<Car>();

        public void Add(Car newCar)
        {
            _list.Add(newCar);
        }
    }
}

和汽车类别:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LinqPractical
{
    public class Car
    {
        private string _make;
        private string _model;
        private string _year;
        private string _pass;
        private string _fail;

        public string Make
        {
            get
            {
                return _make;
            }
            set
            {
                _make = value;
            }
        }

        public string Model
        {
            get
            {
                return _model;
            }
            set
            {
                _model = value;
            }
        }

        public string Year
        {
            get
            {
                return _year;
            }
            set
            {
                _year = value;
            }
        }

        public string Pass
        {
            get
            {
                return _pass;
            }
            set
            {
                _pass = value;
            }
        }

        public string Fail
        {
            get
            {
                return _fail;
            }
            set
            {
                _fail = value;
            }
        }
    }
}

5 个答案:

答案 0 :(得分:2)

Linq不能在任何类上运行。它只能处理通过实现IEnumerable<T>

表示类型列表的类

因此,您可以定义public class CarList : IEnumerable<Car>并自己实现接口,或者像public class CarList : List<Car>那样扩展List-class,然后不再需要class字段。

答案 1 :(得分:2)

您收到的错误是因为您的CarList类未实现IEnumerable。除非您需要创建自己的列表类型可以提供的特定功能,否则Igor关于使用List的评论是正确的方法。如果不需要,请不要过度设计解决方案。

答案 2 :(得分:2)

当您添加仅添加到内部列表的方法(添加)时,导致代码混乱/遗漏的代码。

您的汽车列表类别CarList不是汽车列表,它是包含汽车列表的容器。

因此收到错误的原因是您试图在无法枚举的容器CarList上进行交互。您应该在List<Car>上进行互动,这是由于命名不当而引起的……您的CarList更像是CarProviderA,上面有汽车清单。

无法工作

 var query = from car in carList -- not a list of cars
             where car.Make == "CITROEN"
             select car;

可以工作

 var query = from car in carList.List  -- where List is a public property of _list to the list of cars
             where car.Make == "CITROEN"
             select car;

Car car = new Car(); 

应该在while循环中,您要多次添加相同的实例,这将与之前执行的相同。

应该看起来像这样

while (!reader.EndOfStream)
{
    Car car = new Car(); 
    string line = reader.ReadLine();
    var values = line.Split(',');

    car.Make = values[0];
    car.Model = values[1];
    car.Year = values[2];
    car.Pass = values[3];
    car.Fail = values[4];

    carList.Add(car);
}

答案 3 :(得分:2)

在评论中回答了它,但只是提供一些代码...

在大多数情况下,您不需要为属性设置单独的字段。删除它们将大大提高代码的可读性:

public class Car
{
    public string Make { get; set; }
    public string Model { get; set; }
    // ...
}

现在只需使用通用List并删除您的CarList类(这就是为什么您的代码中出现错误的问题):

var carList = new List<Car>();

您要为每行添加一个护理,所以让我们为每行创建一个护理。我建议使用更紧凑的方式编写此内容(再次:更易于阅读):

while (!reader.EndOfStream)
{
    string line = reader.ReadLine();
    var values = line.Split(',');

    carList.Add(new Car {
      Make = values[0],
      Model = values[1]
    });
}

答案 4 :(得分:0)

我修复了错误,但是现在当我运行程序时,它不会从foreach中打印出任何详细信息。我已经检查了输入到列表中的数据,它不再覆盖了。但是找不到任何东西。