2014-02-08 48 views
1

我有一个类WorldObject。在这堂课中,我保存了一个职位。获取相对于点的最小距离的列表元素

现在我有一个列表WorldObjects。我想找到一个元素,它与给定点具有最小距离。

abstract class WorldObject 
{ 
    private Vector2D _position; 

    public Vector2D Position 
    { 
     get { return _position; } 
     set { _position = value; } 
    } 

    //... 
} 


private List<WorldObject> worldObjects; 

internal WorldObject GetNearestObject(Vector2D pos) 
{ 
    return worldObjects.Min(); 
} 

通常情况下,我可以通过WorldObject实施IComparable搜索最低。但现在我需要这一点作为关系。我怎样才能做到这一点?

回答

2

您可以使用.Aggregate此:

return worldObjects 
    .Aggregate((result, current) => (current.Position.GetDistance(pos) 
            < result.Position.GetDistance(pos)) 
            ? current : result); 

.GetDistance假设功能Vector2D对象之间的计算距离。

另一种可能性是使用morelinq的.MinBy

return worldObjects.MinBy(wo => wo.Position.GetDistance(pos)); 

另一种可能性,但它排序的对象不必要的:

return worldObjects.OrderBy(wo => wo.Position.GetDistance(pos)).First(); 
1

假设你要想办法让2点位置之间的距离:

internal WorldObject GetNearestObject(Vector2D pos) 
{ 
    var minDistance = worldObjects.Min(wo => wo.Position.GetDistance(pos)); 
    return worldObjects.First(wo => wo.Position.GetDistance(pos) == minDistance); 
} 
+0

.GetDistance'的'最有可能的结果是'双“或”浮动“。你不应该用'=='来比较它们。 – BartoszKP

1
internal WorldObject GetNearestObject(Vector2D pos) 
{ 
    return worldObjects.OrderBy(wo => wo.Position.GetDistance(pos)).First(); 
} 
+0

这样做太多比较比需要。 – i3arnon

+0

Linq反正不快,主要是为了方便... 为了快速做到这一点,他应该使用QuadTree并仅对相关对象进行迭代。 –

相关问题