2017-09-21 54 views
2

我在這裏面臨一些問題。 目標是使用4個值對一個集合進行分組,這些值是Origin.PositionCoordinates.X,Origin.PositionCoordinates.Y,Destination.PositionCoordinates.X,Destination.PositionCoordinates.YLinq的多個值組

我得到錯誤提示:

匿名類型不能有多個同名的屬性。

我不能更改設計(不能更改類屬性)。有沒有解決這個問題的方法?以下是我正在努力的示例代碼。

private bool EdgeCollectionIsAppropriate(Dictionary<int, DijkstraEdge> theEdges) 
{ 
    if (theEdges.GroupBy(variable => new { 
      variable.Value.Origin.PositionCoordinates.X, 
      variable.Value.Origin.PositionCoordinates.Y, 
      variable.Value.Destination.PositionCoordinates.X, 
      variable.Value.Destination.PositionCoordinates.Y }).Any(x=>x.Count()>1)) 
    { 
     logger.Debug("The edges list contains 2 or more edges with same destnation and origin position"); 
     return false; 
    } 
    return true; 
} 

回答

3

注意,你是用2種性能與名稱X創建一個匿名類型。 而是到田間地頭給予明確的名稱:(你不必做所有的人只是爲了一個與衝突的名字就足夠了)

theEdges.GroupBy(v=> new { 
    OriginX = v.Value.Origin.PositionCoordinates.X, 
    OriginY = v.Value.Origin.PositionCoordinates.Y, 
    v.Value.Destination.PositionCoordinates.X, 
    v.Value.Destination.PositionCoordinates.Y }) 

而且目前尚不清楚寫這一切在如果聲明。而是將查詢結果存儲在變量中,然後使用if語句:

var dupDestAndOrigin = theEdges.GroupBy(v=> new { 
             OriginX = v.Value.Origin.PositionCoordinates.X, 
             OriginY = v.Value.Origin.PositionCoordinates.Y, 
             v.Value.Destination.PositionCoordinates.X, 
             v.Value.Destination.PositionCoordinates.Y }) 
           .Any(x => x.Count() > 1);  
if(dupDestAndOrigin) 
{ 
    // TODO - log 
    return false; 
} 
return true; 
0

給他們一個不同的名字。您不能在同一個對象中擁有2個X和2個Y屬性。

private bool EdgeCollectionIsAppropriate(Dictionary<int, DijkstraEdge> theEdges) 
    { 

     if (theEdges.GroupBy(variable => new { A=variable.Value.Origin.PositionCoordinates.X, B=variable.Value.Origin.PositionCoordinates.Y,C=variable.Value.Destination.PositionCoordinates.X, D=variable.Value.Destination.PositionCoordinates.Y }).Any(x=>x.Count()>1)) 


     { 
      logger.Debug("The edges list contains 2 or more edges with same destnation and origin position"); 
      return false; 
     } 

     return true; 
    }