本文着重介绍Sum、Select、Average、Min、Max
- 代码中所用到的源代码均是.Net6.0预览版中的代码
- 源代码是截取案例中的代码,需要源代码可在github上自由下载
初始化案例中的函数演示所需的数据
Demo中对于各个函数分析是所需数据的初始化
List<int> listItem = new List<int>();
List<Student> listStudentItem = new List<Student>();
private void InitAggregate()
{
listItem = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
listStudentItem = new List<Student> {
new Student("赵一",1),
new Student("钱二",2),
new Student("张三",3),
new Student("李四",4),
new Student("王五",5),
new Student("孙六",6),
new Student("周七",7),
new Student("吴八",8),
new Student("郑九",9),
new Student("冯十",10)
};
}
1. Sum
Sum顾名思义为求和
1.1. 代码案例
private void btnStructSum_Click(object sender, EventArgs e)
{
int Sum=listItem.Sum();
Console.WriteLine($"Sum:{Sum}");
Console.WriteLine($"值列表:{string.Join(",", listItem)}");
int SumAge = listStudentItem.Sum(a=>a.Age);
Console.WriteLine($"SumAge:{SumAge}");
Console.WriteLine($"引用列表:{string.Join(",", listStudentItem)}");
}
1.2. 案例效果
1.3. 源代码
public static partial class Enumerable
{
public static int Sum(this IEnumerable<int> source)
{
if (source == null)
{
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.source);
}
int sum = 0;
checked
{
foreach (int v in source)
{
sum += v;
}
}
return sum;
}
public static int Sum<TSource>(this IEnumerable<TSource> source, Func<TSource, int> selector)
{
if (source == null)
{
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.source);
}
if (selector == null)
{
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.selector);
}
int sum = 0;
checked
{
foreach (TSource item in source)
{
sum += selector(item);
}
}
return sum;
}
}
2. Select函数
Select函数一般与其他函数结合使用,如本案例中是和FindAll函数结合使用。
2.1. 代码案例
private void btnSelect_Click(object sender, EventArgs e)
{
List<int> listSelect = listItem.FindAll(a => a < 6);
Console.WriteLine($"值列表:{string.Join(",", listSelect)}");
List<int> listSelectAge = listStudentItem.FindAll(a=>a.Age<6).Select(a => a.Age).ToList();
Console.WriteLine($"值列表:{string.Join(",", listSelectAge)}");
}
2.2. 案例效果
2.3. 源代码
public List<T> FindAll(Predicate<T> match)
{
if (match == null)
{
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.match);
}
List<T> list = new List<T>();
for (int i = 0; i < _size; i++)
{
if (match(_items[i]))
{
list.Add(_items[i]);
}
}
return list;
}
3.Average函数
Average函数求平均
private void btnAverage_Click(object sender, EventArgs e)
{
double average = listItem.Average();
Console.WriteLine($"值列表:{average}");
average = listStudentItem.Average(a => a.Age);
Console.WriteLine($"引用列表:{average}");
}
3.2. 案例效果
3.3. 源代码
public static partial class Enumerable
{
public static double Average(this IEnumerable<int> source)
{
if (source == null)
{
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.source);
}
using (IEnumerator<int> e = source.GetEnumerator())
{
if (!e.MoveNext())
{
ThrowHelper.ThrowNoElementsException();
}
long sum = e.Current;
long count = 1;
checked
{
while (e.MoveNext())
{
sum += e.Current;
++count;
}
}
return (double)sum / count;
}
}
public static double Average<TSource>(this IEnumerable<TSource> source, Func<TSource, int> selector)
{
if (source == null)
{
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.source);
}
if (selector == null)
{
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.selector);
}
using (IEnumerator<TSource> e = source.GetEnumerator())
{
if (!e.MoveNext())
{
ThrowHelper.ThrowNoElementsException();
}
long sum = selector(e.Current);
long count = 1;
checked
{
while (e.MoveNext())
{
sum += selector(e.Current);
++count;
}
}
return (double)sum / count;
}
}
}
4. Min\Max函数
4.1. 代码案例
private void btnMin_Click(object sender, EventArgs e)
{
int Min= listItem.Min();
Console.WriteLine($"值列表:{Min}");
int MinAge = listStudentItem.Min(a=>a.Age);
Console.WriteLine($"引用列表:{MinAge}");
}
private void btnMax_Click(object sender, EventArgs e)
{
int Max = listItem.Max();
Console.WriteLine($"值列表:{Max}");
int MaxAge = listStudentItem.Max(a => a.Age);
Console.WriteLine($"引用列表:{MaxAge}");
}
4.2. 案例效果
4.3. 源代码
Min源代码
public static partial class Enumerable
{
public static int Min(this IEnumerable<int> source)
{
if (source == null)
{
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.source);
}
int value;
using (IEnumerator<int> e = source.GetEnumerator())
{
if (!e.MoveNext())
{
ThrowHelper.ThrowNoElementsException();
}
value = e.Current;
while (e.MoveNext())
{
int x = e.Current;
if (x < value)
{
value = x;
}
}
}
return value;
}
public static int Min<TSource>(this IEnumerable<TSource> source, Func<TSource, int> selector)
{
if (source == null)
{
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.source);
}
if (selector == null)
{
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.selector);
}
int value;
using (IEnumerator<TSource> e = source.GetEnumerator())
{
if (!e.MoveNext())
{
ThrowHelper.ThrowNoElementsException();
}
value = selector(e.Current);
while (e.MoveNext())
{
int x = selector(e.Current);
if (x < value)
{
value = x;
}
}
}
return value;
}
}
Max源代码
public static partial class Enumerable
{
public static int Max(this IEnumerable<int> source)
{
if (source == null)
{
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.source);
}
int value;
using (IEnumerator<int> e = source.GetEnumerator())
{
if (!e.MoveNext())
{
ThrowHelper.ThrowNoElementsException();
}
value = e.Current;
while (e.MoveNext())
{
int x = e.Current;
if (x > value)
{
value = x;
}
}
}
return value;
}
public static int Max<TSource>(this IEnumerable<TSource> source, Func<TSource, int> selector)
{
if (source == null)
{
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.source);
}
if (selector == null)
{
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.selector);
}
int value;
using (IEnumerator<TSource> e = source.GetEnumerator())
{
if (!e.MoveNext())
{
ThrowHelper.ThrowNoElementsException();
}
value = selector(e.Current);
while (e.MoveNext())
{
int x = selector(e.Current);
if (x > value)
{
value = x;
}
}
}
return value;
}
}