代码之家  ›  专栏  ›  技术社区  ›  DuckQueen

如何使用LINQ实现模具图案?

  •  -1
  • DuckQueen  · 技术社区  · 7 年前

    我有一个带有x,y,z坐标和值的点列表,比如ints。我要选择一个新的可枚举值,以便每个值都等于value+value[up]+…+值[向下]是一个模具,仅在存在时使用所有周围的值。如何用LINQ制作这种模板图案?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Magnetron    7 年前

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

    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 因此