我有一个包含Int32类型的多个属性的类:
public class MyClass
{
public int C1 { get; set; }
public int C2 { get; set; }
public int C3 { get; set; }
.
.
.
public int Cn { get; set; }
}
我想总结所有这些属性。而不是做:
int sum = C1 + C2 + C3 + ... + Cn
有更高效/更优雅的方法吗?
答案 0 :(得分:2)
你可以假装它,但我不确定它有多么有用:
using System;
using System.Collections.Generic;
using System.Linq;
namespace Demo
{
class Program
{
static void Main(string[] args)
{
var test = new MyClass();
// ...
int sum = test.All().Sum();
}
}
public class MyClass
{
public int C1 { get; set; }
public int C2 { get; set; }
public int C3 { get; set; }
// ...
public int Cn { get; set; }
public IEnumerable<int> All()
{
yield return C1;
yield return C2;
yield return C3;
// ...
yield return Cn;
}
}
}
答案 1 :(得分:2)
如果您确实想要执行总和而不必键入每个属性,则可以使用反射来迭代您的属性,但这会带来很大的性能成本。但是,为了好玩,你可以这样做:
var item = new MyClass();
// Populate the values somehow
var result = item.GetType().GetProperties()
.Where(pi => pi.PropertyType == typeof(Int32))
.Select(pi => Convert.ToInt32(pi.GetValue(item, null)))
.Sum();
PS:不要忘记添加using System.Reflection;
指令。
答案 2 :(得分:1)
也许您可以使用具有IEnumerable接口和自定义类的数组或数据结构。然后你可以使用linq来做Sum()。
答案 3 :(得分:1)
如果有足够强烈的需要将值存储在单独的成员(属性,字段)中,那么是的,这是唯一的方法。但是,如果您有一个数字列表,请将它们存储在列表中,而不是存储在单独的成员中。
或者,丑陋:
new[]{C1,C2,C3,C4}.Sum()
但是比单身&#34; +&#34;更多的角色;反正。
答案 4 :(得分:1)
public class MyClass
{
readonly int[] _cs = new int[n];
public int[] Cs { get { return _cs; } }
public int C1 { get { return Cs[0]; } set { Cs[0] = value; } }
public int C2 { get { return Cs[1]; } set { Cs[1] = value; } }
public int C3 { get { return Cs[2]; } set { Cs[2] = value; } }
.
.
.
public int Cn { get { return Cs[n-1]; } set { Cs[n-1] = value; } }
}
现在,您可以将Enumerable.Sum
与MyClass.Cs
一起使用,并且仍然可以将C1
,C2
,...映射到数据库字段。