所以我有一个List
of string
s 格式像{itemname}-{x}-{y}-{z}
( x
, y
, z
are typeof(int)
)。xyz
我在 3d空间中有一点。从我的观点来看,我想使用 LINQ 获取所有List
在一些半径R
( ) 中的项目。typeof(int)
如何用 LINQ 做这样的事情?
问问题
133 次
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 回答