如何在xyz空间中选择半径中的所有项目?

时间:2012-07-30 16:54:16

标签: c# .net linq

所以我List的{​​{1}} string形成了{itemname}-{x}-{y}-{z} xyz typeof(int) )。我在3d xyz空间中有一个观点。我希望使用LINQ从我的观点获取所有ListRtypeof(int)}中的{{1}}项。如何用LINQ做这样的事情?

3 个答案:

答案 0 :(得分:4)

我会把它分成两个任务:

  • 将字符串解析为更有用的格式
  • 按距离过滤

所以你的查询会是这样的:

var query = values.Select(text => ItemPoint.Parse(text))
                  .Where(item => item.DistanceFrom(point) < radius);

(如果您确实需要返回文本表单,则可以在解析它时将其存储在项目中,然后再进行Select次调用。)

现在你可以轻松地分离出来的方法:ItemPoint.Parse(string)ItemPoint.DistanceFrom(Point)。如果您对这些方法中的任何一个有问题,请创建另一个问题,提供更多详细信息,但LINQ可能无关紧要。

(对于解析部分,您可能需要考虑使用string.Split。)

答案 1 :(得分:1)

以下是LINQ内容的相关部分:

// List of strings formated like {itemname}-{x}-{y}-{z}
List<string> test = new List<string>
{
    "name1-1-1-2",
    "name2-0-1-2",
    "name3-0-0-3"
};

var res = test
    .Select(tmp =>
        {
            string[] items = tmp.Split('-');
            return new
                {
                    x = int.Parse(items[1]),
                    y = int.Parse(items[2]),
                    z = int.Parse(items[3])
                };
        })
    .Where(tmp => (tmp.x + tmp.y + tmp.z) < 4)  // Insert the right math formula here.
    .ToList();

对于实际的数学公式,只需谷歌或搜索SO:Algorithm for calculating a distance between 2 3-dimensional points?

答案 2 :(得分:1)

以下是一个示例,说明如何通过构造匿名类型的实例来将坐标和未解析的值分组到Where子句,然后切断坐标以获取未解析的值。

var itemPoints = new List<string> {
    "quick-1-2-3"
,   "brown-11-22-13"
,   "fox-10-42-33"
,   "jumps-19-23-31"
};
int x0=2, y0=1, z0=0, rSquare = 25;
var itemNames = itemPoints.Select(
    s => {
        var tt = s.Split('-');
        return new {
            Unparsed = s
        ,   x = int.Parse(tt[1])
        ,   y = int.Parse(tt[2])
        ,   z = int.Parse(tt[3])
        };
    }
).Where(p => (p.x-x0)*(p.x-x0)+(p.y-y0)*(p.y-y0)+(p.z-z0)*(p.z-z0) < rSquare)
.Select(p => p.Unparsed)
.ToList();

距离公式对Cartesian distance formula的两边进行平方,以避免取平方根的成本。