gpt4 book ai didi

c# - 任意成员变量的任意计算

转载 作者:行者123 更新时间:2023-11-30 21:00:10 25 4
gpt4 key购买 nike

考虑这个简单的例子:

class Foo
{
public int a;
public int b;
public int c;
public List<Foo> foos; // This complicates matters a bit
}

现在我想计算任何成员的总和/最小值/最大值/平均值等 - 包括 Foo 子级。我想为此创建一个通用函数,这样我就不必重复代码。

我想象这样一个函数调用:

double sum = Calculate<double>(someFoo, sum => (f => f.a));
int count = Calculate<int>(someFoo, count => (f => 1 + foo.Length));

因此,Foo 的任意成员的任意操作。这可以在 C# 4.0 中完成吗?例如。使用 Actions

最佳答案

编写一个辅助函数,为您提供所有 Foo:

IEnumerable<Foo> SelfAndDescendants
{
get
{
yield return this;
foreach(var child in foos)
foreach(var descendant in SelfAndDescendants(child)
yield return descendant;
}
}

然后您可以简单地使用普通的 LINQ 进行聚合:root.SelfAndDescendents.Sum(f=>f.a)


如果您想进一步提高可重用性,可以使用通用辅助函数:

public static IEnumerable<T> DepthFirstTopDownTraversal(T root, Func<T, IEnumerable<T>> children)
{
Stack<T> s=new Stack<T>();
s.Push(root);
while(s.Count>0)
{
T current = s.Pop();
yield return current;
foreach(var child in children(current))
s.Push(child);
}
}

然后将 SelfAndDescendats 实现为 return DepthFirstTopDownTraversal(this, f=>f.foos);

关于c# - 任意成员变量的任意计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15086024/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com