c# - 如何使用 linq 实现“模板”模式?
问题描述
我有一个带有 x、y、z 坐标和“值”的点列表,比如整数。我想选择一个新的可枚举项,使得每个值都等于'value + value[up] +... + value[down]',因此只有当它们存在时才使用所有周围值的模板。如何用 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
相应地改变
推荐阅读
- amazon-web-services - AWS 免费套餐上的 Windows 和 Linux 同步 EC2 实例
- rust - 具有幻像生命周期的结构有什么意义?
- opengl - OpenGL 3D点精灵相机矩阵
- python - 何时在熊猫系列上使用 split 和 str.split()?
- sql-server - 执行时存储过程有效,代理作业失败
- vba - 清除 Word 文档中的所有复选框
- vb.net - Ms Access 查询中的日期过滤(有趣)
- regex - 在python中提取名字作为名字姓氏
- css - .net mvc 默认应用,导航菜单不是水平的
- ios - 使用 Firebase 验证自动登录