【发布时间】:2021-03-05 12:22:38
【问题描述】:
我目前在提取所需汽车时遇到问题,该汽车具有轮胎和发动机组合,这是tires 和engines 列表的一部分。
我有这个设置:
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
public class EngineType
{
public string engineName;
}
public class Tire
{
public string tireName;
}
public class Car
{
public EngineType enginetype;
public Tire tire;
}
public static void Main()
{
List<Car> cars = new List<Car>();
cars.Add(new Car{enginetype = new EngineType{engineName = "enginea"}, tire = new Tire{tireName = "tirea"}});
cars.Add(new Car{enginetype = new EngineType{engineName = "engineb"}, tire = new Tire{tireName = "tireb"}});
cars.Add(new Car{enginetype = new EngineType{engineName = "enginec"}, tire = new Tire{tireName = "tirec"}});
List<Tire> tires = new List<Tire>();
tires.Add(new Tire{tireName = "tirea"});
tires.Add(new Tire{tireName = "tired"});
tires.Add(new Tire{tireName = "tiree"});
List<EngineType> engineTypes = new List<EngineType>();
engineTypes.Add(new EngineType{engineName = "enginea"});
engineTypes.Add(new EngineType{engineName = "engined"});
engineTypes.Add(new EngineType{engineName = "enginec"});
var selectedcars = cars.Where(x=> engineTypes.Contains(x.enginetype) && tires.Contains(x.tire));
Console.WriteLine(selectedcars.Count);
}
}
这虽然给了我一个错误,因为selectedcars 不包含
为什么不呢?
【问题讨论】:
-
您需要
selectedcars.Count()。此外,您的代码将失败,因为engineTypes和carTypes中的引用指向的对象与Car对象中的引用不同。 -
so contains 不要按值比较,而是按引用比较?有没有可能按价值来做?
-
@J.Down:它们是类,所以引用类型,你没有覆盖
Equals,所以使用Object.Equals,它使用ReferenceEquals并忽略你的名字。EngineType和Tire可以实现IEquatable<T>或者您可以实现自定义IEqualityComparer<T>来比较名称,并且可以在 LINQ 方法中使用,例如Enumerable.Contains。 -
或根据身份解析填充对象图。即:首先创建
engineTypes并将Car.EngineType设置为现有类型之一。轮胎也一样。这类似于大多数 ORM 填充对象图的方式。