2012-03-12 36 views
3

我本来应该写一个方法,它会对整数,浮点数或双精度的集合进行加法。我将编写三种方法,它们将遍历三种不同的类型执行添加并返回值。有用。我只是好奇,这是可以在一个单一的方法,该类型传递AA泛型类型来完成,像如何使用泛型为多种数据类型创建通用方法?

public static T SUM<T>(IEnumerable<T> dataCollection) 
{ 
T total; 
foreach(var value in dataCollection) 
total += value; 
return total; 
} 

我能够正常三法实现,但只是好奇,想解决它,就是它甚至可能吗?

感谢,

回答

6

它无法在其上键入的泛型参数表达式中使用运营商如+/-/*/etc ...。这些仅在处理具体类型时才起作用。

要做到这一点与泛型,你需要通过一个抽象,明白如何操作+的实际类型T。例如,这里有一个例子拉姆达

public static T SUM<T>(IEnumerable<T> dataCollection, Func<T, T, T> sum) 
{ 
    T total = default(T); 
    foreach(var value in dataCollection) 
    total = sum(total, value); 
    return total; 
} 

List<int> list = ...; 
list.Sum((left, right) -> left + right); 

注:正如一些人指出我写到这里的功能是System.Linq.Enumerable.Aggregate基本相同。请使用该代码与将其放入代码中。

+0

很好的解释。 – Nair 2012-03-12 21:42:47

+0

当然,这只不过是一个roll-your-own的Aggregate()函数,因为传递的lambda可以是从左到右的任何内容。 – KeithS 2012-03-12 21:45:28

+1

@Nair,请注意,这个函数已经存在[Enumerable.Aggregate](http://msdn.microsoft.com/en-us/library/system.linq.enumerable.aggregate.aspx),请尝试使用它相反,除非你这样做来学习一些东西。 – 2012-03-12 21:46:42

相关问题