Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#使用数组获取最高项_C# - Fatal编程技术网

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
。您也不能使用
双精度(
高度
)索引到数组中。