0

我有一个包含多个 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

有没有更有效/优雅的方法?

4

5 回答 5

3

你可以伪造它,但我不确定它有多大用处:

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; 
        }
    }
}                                                                                            
于 2012-11-28T08:44:47.357 回答
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;指令。

于 2012-11-28T08:48:14.813 回答
1

也许您可以使用具有 IEnumarable 接口与自定义类的数组或数据结构。然后你可以使用 linq 来做 Sum()。

于 2012-11-28T08:33:48.547 回答
1

如果有足够强烈的需要将值存储在单独的成员(属性、字段)中,那么是的,这是唯一的方法。但是,如果您有一个数字列表,请将它们存储在一个列表中,而不是单独的成员中。

或者,丑陋的:

new[]{C1,C2,C3,C4}.Sum()

但无论如何,比单个“+”更多的字符。

于 2012-11-28T08:36:42.373 回答
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.Sumwith MyClass.Cs,并且您仍然可以将C1, C2, ... 映射到数据库字段。

于 2012-11-28T08:41:07.023 回答