考虑两个列表中的按元素加/减/乘/除运算。我的代码如下。
public class Calculate
{
public static IEnumerable<T> Add<T>(IEnumerable<T> input1, IEnumerable<T> input2)
{
return input1.Zip(input2, (first, second) => (dynamic)first + (dynamic)second).Cast<T>();
}
public static IEnumerable<T> Subtract<T>(IEnumerable<T> input1, IEnumerable<T> input2)
{
return input1.Zip(input2, (first, second) => (dynamic)first - (dynamic)second).Cast<T>();
}
public static IEnumerable<T> Multiply<T>(IEnumerable<T> input1, IEnumerable<T> input2)
{
return input1.Zip(input2, (first, second) => (dynamic)first * (dynamic)second).Cast<T>();
}
public static IEnumerable<T> Divide<T>(IEnumerable<T> input1, IEnumerable<T> input2)
{
return input1.Zip(input2, (first, second) => (dynamic)first / (dynamic)second).Cast<T>();
}
}
测试
List<double> doubles = new List<double>();
for (int i = 0; i < 10; i++)
{
doubles.Add((double)i);
}
foreach (var element in Calculate.Add(doubles, doubles))
{
Console.WriteLine(element.ToString());
}
它确实有效,但是处理
dynamic
,我想知道这是否是正确的方法?代码足够通用吗?
我建议在这里使用通用数学,例如
public static IEnumerable<T> Add<T>(IEnumerable<T> input1, IEnumerable<T> input2)
where T : IAdditionOperators<T, T, T> {
ArgumentNullException.ThrowIfNull(input1);
ArgumentNullException.ThrowIfNull(input2);
return input1.Zip(input2, (first, second) => first + second).Cast<T>();
}
public static IEnumerable<T> Subtract<T>(IEnumerable<T> input1, IEnumerable<T> input2)
where T : ISubtractionOperators<T, T, T> {
ArgumentNullException.ThrowIfNull(input1);
ArgumentNullException.ThrowIfNull(input2);
return input1.Zip(input2, (first, second) => first - second).Cast<T>();
}
public static IEnumerable<T> Multiply<T>(IEnumerable<T> input1, IEnumerable<T> input2)
where T : IMultiplyOperators<T, T, T> {
ArgumentNullException.ThrowIfNull(input1);
ArgumentNullException.ThrowIfNull(input2);
return input1.Zip(input2, (first, second) => first * second).Cast<T>();
}
public static IEnumerable<T> Divide<T>(IEnumerable<T> input1, IEnumerable<T> input2)
where T : IDivisionOperators<T, T, T> {
ArgumentNullException.ThrowIfNull(input1);
ArgumentNullException.ThrowIfNull(input2);
return input1.Zip(input2, (first, second) => first / second).Cast<T>();
}