3

所以我有一个Listof strings 格式像{itemname}-{x}-{y}-{z}( x, y, zare typeof(int))。xyz我在 3d空间中有一点。从我的观点来看,我想使用 LINQ 获取所有List在一些半径R( ) 中的项目。typeof(int)如何用 LINQ 做这样的事情?

4

3 回答 3

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.)

于 2012-07-30T17:00:51.327 回答
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();

对于实际的数学公式,只需 google 或搜索它:Algorithm for calculate a distance between 2 3-dimensional points?

于 2012-07-30T17:01:19.997 回答
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();

距离公式对笛卡尔距离公式的两边进行平方,以避免取平方根的成本。

于 2012-07-30T17:08:09.970 回答