C#使用数组获取最高项目

时间:2014-01-27 16:13:00

标签: 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) 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();
}

3 个答案:

答案 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作为数组的索引。我做了一些假设,但这可能就是你要找的。

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