我有一个带有x,y,z坐标和“值”(以整数表示)的点的列表。我想选择一个新的可枚举值,使每个值都等于“值+值[上] + ... +值[下]”,这样一个模版将仅使用所有周围的值(如果存在)。如何用linq做这样的模具图案?
答案 0 :(得分:1)
如何创建一个方法来说明两个值是否为负数:
public class Class1
{
public int x;
public int y;
public int z;
public int myValue;
public static bool IsNeighbour(Class1 c1, Class1 c2)
{
bool ret = ((Math.Abs(c1.x - c2.x) == 1) && c1.y == c2.y && c1.z == c2.z) ||
((Math.Abs(c1.y - c2.y) == 1) && c1.x == c2.x && c1.z == c2.z) ||
((Math.Abs(c1.z - c2.z) == 1) && c1.y == c2.y && c1.x == c2.x);
return ret;
}
}
然后,您可以致电:
//lc is a List<Class1>;
var result = lc.Select(currItem =>
lc.Where(anItem =>
Class1.IsNeighbour(currItem, anItem)).Sum(item => item.myValue) + currItem.myValue);
对于每个项目,它将选择其邻居,将其加起来并添加当前项目的值。
如果您的逻辑也考虑对角线元素或其他事物,那么您要做的就是相应地更改IsNeighbour