在Linq中按多个值分组

时间:2017-09-21 07:26:01

标签: c# linq

我在这里面临一些问题。 目标是使用4个值对集合进行分组,这些值为Origin.PositionCoordinates.XOrigin.PositionCoordinates.YDestination.PositionCoordinates.XDestination.PositionCoordinates.Y

我收到错误说明:

  

匿名类型不能具有同名的多个属性。

我无法更改设计(无法更改类属性)。有解决方案可以解决这个问题吗?下面是我正在努力的示例代码。

 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;
}

2 个答案:

答案 0 :(得分: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语句中写出所有内容。而是将查询结果存储在变量中,然后使用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;

答案 1 :(得分:0)

给他们一个不同的名字。您不能在同一对象中具有2个X和2Ys属性。

 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;
    }