C#使用数组获取最高项
我尝试从地图中获取最高的项目,但代码不起作用:(希望大家了解更多关于数组的信息:) 错误:C#使用数组获取最高项,c#,C#,我尝试从地图中获取最高的项目,但代码不起作用:(希望大家了解更多关于数组的信息:) 错误: 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)
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:
代码:
TopItem
不应为空。您应该使用您期望的其他使用列表的最大长度初始化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();
}
private-MapItem-GetTopItem(intx,inty)
{
双倍高度=0.0;
//这里应该初始化数组
//MapItem[]TopItem=null;
List topItems=新列表();
foreach(此.FloorItems.Values中的MapItem@class)
{
如果(@class.Int32_0==X&&@class.Int32_1==Y)
{
高度+=@class.Height;
//TopItem[高度]=@class;
添加(@class);
}
}
//返回TopItem.Max();
返回topItems.Last().Max();
}
TopItem
不应为空。您应该使用您期望的其他使用列表的最大长度初始化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();
}
private-MapItem-GetTopItem(intx,inty)
{
双倍高度=0.0;
//这里应该初始化数组
//MapItem[]TopItem=null;
List topItems=新列表();
foreach(此.FloorItems.Values中的MapItem@class)
{
如果(@class.Int32_0==X&&@class.Int32_1==Y)
{
高度+=@class.Height;
//TopItem[高度]=@class;
添加(@class);
}
}
//返回TopItem.Max();
返回topItems.Last().Max();
}
将TopItem
初始化为null
,然后尝试在if
块中引用它。它是空的,没有任何参考
无论如何,为什么需要构建一个值数组?如果您只是在现有数据中查找最高的高度
值,那么只需从该数据中提取它即可。大概是这样的:
return this.FloorItems.Values
.Where(f => f.Int32_0 == X && f.Int32_1 == Y)
.OrderByDescending(f => f.Height)
.First();
这将对现有数据进行操作,根据正在使用的X/Y值进行过滤,对其进行排序,并在排序后返回第一个值
还是我误解了这段代码的作用?诚然,考虑到您所使用的非常非传统的命名方案,很难遵循
请注意,这假定
此.FloorItems.Values
中至少有一个值。如果该集合可能为空,则需要执行某种类型的错误检查。如何处理这个问题取决于您,因为该方法希望返回一个值MapItem
。您可以返回null
,但这有点反模式。为无效数据引发异常是一种常见的方法。将TopItem
初始化为null
,然后尝试在if
块中引用它。它是空的,没有任何参考
无论如何,为什么需要构建一个值数组?如果您只是在现有数据中查找最高的高度
值,那么只需从该数据中提取它即可。大概是这样的:
return this.FloorItems.Values
.Where(f => f.Int32_0 == X && f.Int32_1 == Y)
.OrderByDescending(f => f.Height)
.First();
这将对现有数据进行操作,根据正在使用的X/Y值进行过滤,对其进行排序,并在排序后返回第一个值
还是我误解了这段代码的作用?诚然,考虑到您所使用的非常非传统的命名方案,很难遵循
请注意,这假定
此.FloorItems.Values
中至少有一个值。如果该集合可能为空,则需要执行某种类型的错误检查。如何处理这个问题取决于您,因为该方法希望返回一个值MapItem
。您可以返回null
,但这有点反模式。为无效数据引发异常是一种常见的方法。您的代码有点混乱,最明显的是使用双倍高度作为数组的索引。我做了一些假设,但这可能就是你想要的
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
您的代码有点混乱,最明显的是使用双高
作为数组的索引。我做了一些假设,但这可能就是你想要的
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
您的MapItem[]TopItem=null
。您从未创建数组,但尝试使用MapItem[Height]=@class
访问它。也不要使用变量名@class
。您也不能使用双精度(Height
)索引到数组中。您的MapItem[]TopItem=null
就是这样做的。您从未创建数组,但尝试使用MapItem[Height]=@class
访问它。也不要使用变量名@class
。您也不能使用双精度(高度
)索引到数组中。