如何使用linq实现“模具”模式?

时间:2018-07-29 16:33:18

标签: c# linq

我有一个带有x,y,z坐标和“值”(以整数表示)的点的列表。我想选择一个新的可枚举值,使每个值都等于“值+值[上] + ... +值[下]”,这样一个模版将仅使用所有周围的值(如果存在)。如何用linq做这样的模具图案?

1 个答案:

答案 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