【问题标题】:What is the LINQ way to select x and y from same z from a List of 3D Vector?从 3D 矢量列表中的相同 z 中选择 x 和 y 的 LINQ 方法是什么?
【发布时间】:2013-08-09 09:28:02
【问题描述】:

我在一个列表中有一些 3D 数据:

myDataList[0] - { X: 164 , Y: 79 , Z: 120 }
myDataList[1] - { X: 146 , Y: 63 , Z: 120 }
myDataList[2] - { X: 192 , Y: 59 , Z: 120 }
myDataList[3] - { X: 196 , Y: 59 , Z: 120 }
myDataList[4] - { X: 110 , Y: 55 , Z: 120 }
myDataList[5] - { X: 148 , Y: 69 , Z: 122 }
myDataList[6] - { X: 194 , Y: 59 , Z: 122 }
myDataList[7] - { X:  18 , Y: 47 , Z: 122 }

我想根据同一个Z坐标得到X和Y坐标

我正在尝试通过循环以 LINQ 方式执行此操作。

for (int i = 0; i < myDataList.Count; i++)
{
    myXList = myDataList.Where(x => myDataList[i].Z == myDataList[i + 1]).Select(x => x.X).ToList();

    myYList = myDataList.Where(y => myDataList[i].Z == myDataList[i + 1]).Select(y => y.Y).ToList();
}

但是我现在的问题是如何从列表中区分相同的 Z 并选择 X 和 Y。上面的 for 循环是错误的,因为它只检查 ii + 1 的不同 Z 但是不是所有的 i 一次。

有帮助吗?

【问题讨论】:

  • GroupBy Z坐标...?

标签: c# linq for-loop 3d


【解决方案1】:

类似:

var grouped = from p in myDataList
              group p by p.Z into q
              select q;

// Or, equivalent considering you don't have to reuse q
var grouped2 = from p in myDataList
               group p by p.Z;

// Or, equivalent using functional LINQ
var grouped3 = myDataList.GroupBy(p => p.Z);

foreach (var group in grouped)
{
    int z = group.Key;

    foreach (var element in group)
    {
        // Where element is the "original" object
        int x = element.X;
        int y = element.Y;
        int z2 = element.Z; // same as z
    }
}

技术上甚至还有.ToLookup 方法,类似于GroupBy

var grouped4 = myDataList.ToLookup(p => p.Z);

生成的组与.GroupBy 生成的组一样使用。差异很微妙...https://stackoverflow.com/a/1337567/613130

【讨论】:

    【解决方案2】:
    var coordinates = new List<Coordinate>()
    {
        new Coordinate { X = 164 , Y = 79 , Z = 120 },
        new Coordinate { X = 146 , Y = 63 , Z = 120 },
        new Coordinate { X = 192 , Y = 59 , Z = 120 },
        new Coordinate { X = 196 , Y = 59 , Z = 120 },
        new Coordinate { X = 110 , Y = 55 , Z = 120 },
        new Coordinate { X = 148 , Y = 69 , Z = 122 },
        new Coordinate { X = 194 , Y = 59 , Z = 122 },
        new Coordinate { X =  18 , Y = 47 , Z = 122 }
    };
    
    var grouped = coordinates
        .Select(c => c.Z)
        .Distinct()
        .ToDictionary(
            z => z, 
            z => coordinates.Where(c => c.Z == z));
    

    【讨论】:

      猜你喜欢
      • 2014-09-30
      • 2013-02-26
      • 1970-01-01
      • 2014-12-13
      • 2018-12-13
      • 2011-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多