我尝试从地图中获取最高项目,但代码无法正常工作:(希望大家更多了解数组:)错误:
System.NullReferenceException was caught
HResult=-2147467261
Message=Object reference not set to an instance of an object.
Source=Game1
StackTrace:
in Game1.Map.GetTopItem(Int32 X, Int32 Y) Line 11
in UserMovedToItem(User User, MapItem MapItem, String Extra)
InnerException:
代码:
private MapItem GetTopItem(int X, int Y)
{
double Height = 0.0;
MapItem[] TopItem = null;
foreach (MapItem @class in this.FloorItems.Values)
{
if (@class.Int32_0 == X && @class.Int32_1 == Y)
{
Height += @class.Height;
TopItem[Height] = @class;
}
}
return TopItem.Max();
}
答案 0 :(得分:2)
您将TopItem
初始化为null
,然后尝试在if
块中引用它。它是null
,没有什么可以参考。
为什么还需要构建一个值数组?如果您只是在已经拥有的数据中寻找最高Height
值,那么只需从该数据中提取它即可。像这样:
return this.FloorItems.Values
.Where(f => f.Int32_0 == X && f.Int32_1 == Y)
.OrderByDescending(f => f.Height)
.First();
这对现有数据进行操作,按您正在使用的X / Y值进行过滤,对其进行排序,并在排序后返回第一个值。
或者我误解了这段代码在做什么?不可否认,鉴于您正在使用的非常规命名方案,非常很难遵循。
请注意,这假设this.FloorItems.Values
中的至少一个值。如果该集合可能为空,那么您将需要执行某种错误检查。您如何处理由您决定,因为该方法期望返回值MapItem
。你可以返回null
,但这有点像反模式。抛出无效数据的异常是一种常见的方法。
答案 1 :(得分:1)
TopItem
不应为null。您应该使用您希望别人使用LIST
MapItem[]
数组
private MapItem GetTopItem(int X, int Y)
{
double Height = 0.0;
//here you should initialize your array
//MapItem[] TopItem = null;
List<MapItem> topItems = new List<MapItem>();
foreach (MapItem @class in this.FloorItems.Values)
{
if (@class.Int32_0 == X && @class.Int32_1 == Y)
{
Height += @class.Height;
//TopItem[Height] = @class;
topItems.Add(@class);
}
}
//return TopItem.Max();
return topItems.Last().Max();
}
答案 2 :(得分:1)
您的代码有点令人困惑,最明显的是使用double Height
作为数组的索引。我做了一些假设,但这可能就是你要找的。 p>
private MapItem GetTopItem(int X, int Y)
{
return this.FloorItems.Where(item => item.Int32_0 == X && item.Int32_1 == Y)
.OrderByDescending(item => item.Height)
.FirstOrDefault( );
}
这简洁地完成了同样的事情。首先,它使用Where
方法选择符合条件的项目。然后,使用OrderByDescending
,它使用item.Height
属性将项目从最大到最小排序。最后,它使用FirstOrDefault
选择应该是最大的第一个项目,如果该集合不包含任何元素,则返回null
。