从属于对象的所有列表中获取元素总数

时间:2016-07-12 19:38:03

标签: c# linq

我得到了一些代码,其中的对象由不同类型的列表组成。我的意思的一个简单例子:

public class Account
{
    private long accountID;
    private List<string> accountHolders;
    private List<string> phoneNumbers;
    private List<string> addresses;

    public Account()
    {
        this.accountHolders = new List<string>();
        this.phoneNumbers = new List<string>();
        this.addresses = new List<string>();
    }

    public long AccountID
    {
        get
        {
            return this.accountID;
        }
        set
        {
            this.accountID = value;
        }
    }
}

对于要求,我需要获取每个列表中的元素总数以进行验证。我有以下方法可行:

public class AccountParser
{
    // Some code
    public int CountElements(Account acct)
    {
        int count = 0;
        count += acct.accountHolders.Count();
        count += acct.phoneNumbers.Count();
        count += acct.addresses.Count();

        return count;
    }
}

但是想知道是否有更好的方法来做到这一点。我知道我可以使用Linq枚举一个列表,但在这种情况下我似乎无法使用它。

2 个答案:

答案 0 :(得分:5)

你正在做的是正确的事

您可以在一行中执行此操作而不声明任何变量

public int CountElements(Account acct)
{
    return acct.accountHolders.Count() + acct.phoneNumbers.Count() + acct.addresses.Count();
}

但它没有太大变化。

列表的数量是静态的,因为该类是静态的,所以如果结构不会改变,使用Reflection是没有意义的。

现在,您可以拥有多个具有不同类型列表的Account个类。在这种情况下,我将创建一个抽象的AbsAccount类,它具有抽象的CountElements属性:

public abstract class AbsAccount 
{
    public abstract int CountElements { get; }
}

public class Account: AbsAccount 
{
    private List<string> accountHolders;
    private List<string> phoneNumbers;
    private List<string> addresses;

    public override int CountElements
    {
        get 
        {
            return this.accountHolders.Count() 
                + this.phoneNumbers.Count() 
                + this.addresses.Count(); 
        }
    }
}


public class AccountParser
{
    // Some code
    public int CountElements(AbsAccount acct)
    {
        return acct.CountElements;
    }
}

但也许我太过分了......

答案 1 :(得分:2)

您可以将项目添加到列表中,然后在其上调用.Sum方法,但从性能的角度来看并不是更好。

public class AccountParser
{
    // Some code
    public int CountElements(Account acct)
    {

        List<string> all = new List<string>();
        all.AddRange(acct.accountHolders);
        all.AddRange(acct.phoneNumbers);
        all.AddRange(acct.addresses);

        return all.Count();
    }
} 

另一种方法是(因为我可以看到你没有直接暴露你的列表)使用观察者模式,并在每次更新你的一个列表时更新另一个字段甚至列表中的元素数量。然后从该字段中获取值,但我认为最好的方法是您已采用的方法。