所以我List
的{{1}} string
形成了{itemname}-{x}-{y}-{z}
x
,y
,z
typeof(int)
)。我在3d xyz
空间中有一个观点。我希望使用LINQ从我的观点获取所有List
(R
(typeof(int)
}中的{{1}}项。如何用LINQ做这样的事情?
答案 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的两边进行平方,以避免取平方根的成本。