首页 > 解决方案 > 如何使用 linq 实现“模板”模式?

问题描述

我有一个带有 x、y、z 坐标和“值”的点列表,比如整数。我想选择一个新的可枚举项,使得每个值都等于'value + value[up] +... + value[down]',因此只有当它们存在时才使用所有周围值的模板。如何用 linq 做这样的模板图案?

标签: c#linq

解决方案


怎么样,创建一个方法来判断两个值是否是邻居:

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相应地改变


推荐阅读