2014-07-24 98 views
2

我想要按照距离的升序循环列表中的每个项目(因此最先使用的是最近的目标)。LINQ - 按距离排序(计算值)

foreach (ShipCompartment enemyComp in enemy.ListOfCompartments.OrderBy(...)) 

问题是距离不是类的成员。因此,我不能使用:

foreach (ShipCompartment enemyComp in enemy.ListOfCompartments 
    .OrderBy(c => c.Distance)) 

用于计算距离的代码是:

// Get distance between player and enemy compartments 
float distanceToTarget = Vector2.Distance(playerComp.Position, 
    enemyComp.Position); 

如何可以将计算到的OrderBy()?我查过here,但它只返回最接近的Vector2。

非常感谢您的协助。

+1

你试过像'的foreach(ShipCompartment enemyComp在enemy.ListOfCompartments.OrderBy(C => Vector2.Distance(playerComp.Position,c.Position)))'? –

+0

@Rowland完美!这么简单,但我从来没有想过它!请把它写成答案,我会接受它。感谢大家的帮助。 – user3256944

回答

3

简单的办法是移动的函数调用OrderBy通话,所以像:

foreach (ShipCompartment enemyComp in enemy.ListOfCompartments.OrderBy(c => Vector2.Distance(playerComp.Position, c.Position))) 
1

如果您需要,最好的解决方案一般来说(而不仅仅是排序)是使用Select来创建一个包含Distance的定义的新结构,然后使用OrderBy。例如:

对于数据结构:

class Coordinates 
{ 
    public int Value { get; set; } 
    public float Longitude { get; set; } 
    public float Latitude { get; set; } 
} 

你这样称呼它:

foreach(var coordinate in coordinates.Select(x=> new 
    { 
     Value = x.Value, 
     Longitude = x.Longitude, 
     Latitude = x.Latitude, 
     Distance = x.Longitude + x.Latitude 
    }).OrderBy(x=>x.Distance)) 
    Process(coordinate); 
0

您也可以创建自己的自定义比较,并把它作为排序依据的参数:

public class ShipCompartmentDistanceComparer : IComparer<ShipCompartment> 
     { 
      public int Compare(ShipCompartmentDistance x, y) 
      { 
       float distanceToTargetX = Vector2.Distance(playerComp.Position, x.Position); 
       float distanceToTargetY = Vector2.Distance(playerComp.Position, y.Position); 
       if (distanceToTargetX > distanceToTargetY) 
        return 1; 
       if (distanceToTargetX < distanceToTargetY) 
        return -1; 
       else 
        return 0; 
      } 
     } 

然后你只需要拨打:

foreach (ShipCompartment enemyComp in enemy.ListOfCompartments 
    .OrderBy(c => c, new ShipCompartmentDistanceComparer()))