我正在尝试编写一个程序,该程序从.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;
}
}
}
}
答案 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中打印出任何详细信息。我已经检查了输入到列表中的数据,它不再覆盖了。但是找不到任何东西。