使函数计算多个数组中的元素

时间:2011-03-14 10:14:11

标签: c#

喂,

由于某种原因(我无法解决)返回一个ilist的函数在我调用它时保持返回null(即使在同一方法中它早先返回一个空的ilist,但是无论如何)所以我正在制作一个函数接受多个列表,然后输出所有列表中的元素总数(忽略空值以避免异常)。

到目前为止,我有:

private int TotalItemsInLists(params IList[] lists)
    {
        int total = 0;


        foreach (IList list in lists)
            if (list != null)
                total += list.Count;

        return total;
    }

但是这导致了params IList[] lists似乎没有被正确调用的问题,因为IList都是不同类型的列表。

任何人都知道如何解决这个问题?

谢谢, 哈利

编辑:以下是调用它的代码

private bool TooManyItems(Person person)
    {
        return TotalItemsInLists(jobService.BeingDevelopedBy(person), jobService.BeingTestedBy(person),
                                 jobService.BeingFixedBy(person), quoteService.BeingProducedBy(person),
                                 ticketService.BeingActivelyHandledBy(person),
                                 ticketService.BeingTestedBy(person),
                                 ticketService.AllAvailable(person)) > 10;
    }

这是他们调用的方法之一的示例(它们都非常相似,只是不同的数据库和过滤器)

public IList<Ticket> BeingActivelyHandledBy(Person person)
    {
        return (from ticket in Query()
                where ticket.Handler == person
                      && ticket.Status == TicketStatus.Open
                      && ticket.Release == null
                select ticket).ToList();
    }

5 个答案:

答案 0 :(得分:1)

您必须将输入转换为IList

TotalItemsInLists((IList)jobService.BeingDevelopedBy(person), ...

答案 1 :(得分:1)

如果IList<T>是实现ICollection的所有对象(很可能,因为BCL中实现IList<T>的大多数集合类也实现了ICollection) ,然后您可以简单地转换为ICollection,尽管您将失去类型安全性。

private int TotalItemsInLists(params object[] lists)
{
    int total = 0;

    // this casts each object implicitly to ICollection
    foreach (ICollection list in lists)
        if (list != null)
            total += list.Count;

    return total;
}

如果没有,那么您需要返回非通用IEnumerable并使用Cast<object>

private int TotalItemsInLists(params IEnumerable[] lists)
{
    int total = 0;

    foreach (IEnumerable list in lists)
        if (list != null)
            total += list.Cast<object>().Count();

    return total;
}

答案 2 :(得分:1)

我认为您唯一能做的就是更改方法以接受非通用IEnumerable类型。

private int TotalItemsInLists(params IEnumerable[] lists)
{
    int total = 0;

    foreach (var list in lists)
        if (list != null)
            total += list.Count();

    return total;
}

如果性能成为问题,如果类型也是泛型或非泛型ICollection并且直接读取其Count属性,则可以快速检查循环。

答案 3 :(得分:1)

如果你的列表生成方法返回例如List<Ticket>而不是IList<Ticket>,那么它应该很好,因为List<T>实现了IList

答案 4 :(得分:1)

基本上,你的代码不起作用的原因是因为通用IList<T> 实现非通用IList接口(它只是巧合{{1}碰巧实现了两个接口。)

您传递的参数的静态类型似乎都是List<T>,因此您清楚地知道它不会起作用。

一种解决方法是依靠经典的IList<SomeThing>接口并完成方法本身的所有工作,即找出获得每个子序列计数的最快方法。

这是一个未经测试的样本:

IEnumerable