我是C#的新手,来自Java,语法略有不同。 我试图在arrayList中返回一个元素的双重。
public ArrayList vehicleList { get; set; }
class Vehicle
{
//A vehicle can be a car and must have an ID, a price and a licenseplate number.
public int iD { get; set; }
public double price { get; set; }
public string licensePlate { get; set; }
public typeVehicle type;
//Constructor of vehicle, type of vehicle will be parsed from string to enum.
public Vehicle(int iD, string typeName, double price, string license)
{
this.iD = iD;
this.type = (typeVehicle)Enum.Parse(typeof(typeVehicle), typeName);
}
}
//Get the price of the vehicle with parameter ID.
public double getPriceVehicle(int iD)
{
if (iD >= 0 && iD < vehicleList.Count)
{
foreach (Vehicle vehicle in vehicleList)
{
return vehicleList.Contains(iD).price;
}
}
}
问题是我在返回线上收到错误,我无法在线找到任何解决方案。任何帮助将不胜感激。
答案 0 :(得分:2)
List<Vehicle> vehicleList { get; set; }
//Get the price of the vehicle with parameter ID.
public double GetPriceVehicle(int id)
{
var result = vehicleList.FirstOrDefault(v => v.ID == id);
if (result == null)
{
throw new NotImplementedException(String.Format("Vehicle with ID={0} was not found", id)); //todo: put in the logic you want for when no vehicle has the given id
}
return result.Price;
}
1)使用Vehicle类型的通用列表(System.Collections.Generic.List<Vehicle>
)而不是ArrayList
。有关详细信息,请参阅此处:ArrayList vs List<> in C#
2)您使用ID作为ID和索引。即,ID是分配给特定车辆的值,无论您是否添加或移除其他车辆,该值都应保持不变;即它是一个标识符。索引是列表中项目的编号。举个例子,如果我在一个车道的排队中,并且队列前面的车拉开了,那么他们就会离开我的索引变化;也就是说,我从队列中的第5位变为第4位。另一方面,如果我正在与我的保险公司谈话并且他们说我的车存档为#3265,如果他们失去了客户,我不会指望他们写信给我说我的ID现在是#3264,那个我现在需要更新所有带有此参考编号的文档。
3)这里的Where
逻辑使用称为lambda表达式的东西;即我们正在搜索列表中的所有车辆,其中一个车辆的ID与传入该功能的ID相匹配。这个lambda表达式可以放在实际的Where
语句中(例如Where(v => v.ID == id).FirstOrDefault()
),但FirstOrDefault
允许我们直接在其中包含lambda表达式。
https://msdn.microsoft.com/en-us/library/bb397687.aspx
4)FirstOrDefault
表示如果我们找到结果,我们就会停止搜索(即我们不会期望第二辆车在同一个ID上,所以不要浪费时间照看我们找到的车辆) 。 FirstOrDefault的Default部分表示如果找不到匹配项,则返回此类型的默认值; default(Vehicle)
;给定Vehicle是引用类型(即类),为null。
https://msdn.microsoft.com/pt-br/library/bb909042(v=vs.90).aspx
5)如果结果为null,我们将无法返回result.Price
;因为null对象没有属性会出错。错误很好;但不一定有帮助;最好抛出我们自己详细说明问题的错误;然后,我们可以在调用此方法的任何代码中以合理的方式添加逻辑来处理该错误。
https://msdn.microsoft.com/en-us/library/ms173163.aspx
6)我还改变了一些变量/属性名称;例如iD
到ID
。一般来说,任何公共应该是pascalCase;任何私人/本地应该在camelCase中。 https://msdn.microsoft.com/en-us/library/ms229043(v=vs.100).aspx
7)我没有在这里实现它,但更好的选择可能是通用词典(Dictionary<long, Vehicle>
);由于此数据结构已针对快速检索进行了优化,因此不是搜索列表中的每个项目以查找匹配项,而是使用哈希表快速查找与给定键/ ID关联的数据。
http://geekswithblogs.net/blackrabbitcoder/archive/2011/06/16/c.net-fundamentals-choosing-the-right-collection-class.aspx
答案 1 :(得分:2)
包含返回布尔值。布尔没有价格成员。
在Java风格中你会这样做:
//Get the price of the vehicle with parameter ID.
public double getPriceVehicle(int iD)
{
if (iD >= 0 && iD < vehicleList.Count)
{
foreach (Vehicle vehicle in vehicleList)
{
if (vehicle.iD == iD) return vehicle.price;
}
}
return 0;
}
但是在C#中我们拥有LINQ的力量!
public List<Vehicle> vehicleList { get; set; }
class Vehicle
{
//A vehicle can be a car and must have an ID, a price and a licenseplate number.
public int iD { get; set; }
public double price { get; set; }
public string licensePlate { get; set; }
public typeVehicle type;
//Constructor of vehicle, type of vehicle will be parsed from string to enum.
public Vehicle(int iD, string typeName, double price, string license)
{
this.iD = iD;
this.type = (typeVehicle)Enum.Parse(typeof(typeVehicle), typeName);
}
}
//Get the price of the vehicle with parameter ID.
public double getPriceVehicle(int iD)
{
if (iD < 0 || iD >= vehicleList.Count)
throw new ArgumentOutOfRangeException("iD");
var vehicle = vehicleList.FirstOrDefault(v => v.iD == iD);
return vehicle == null ? double.NaN : vehicle.price;
}
答案 2 :(得分:1)
参数iD是数组的索引吗?
我的建议是使用List而不是ArrayList。
private List<Vehicle> vehicleList;
public double getVehiclePrice(int index){
if(index >= 0 && index < vehicleList.Count){
return vehicleList[index].price;
}
}