喂,
由于某种原因(我无法解决)返回一个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();
}
答案 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)