2014-07-24 97 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()))