C# 中两个列表中的逐元素加/减/乘/除运算

问题描述 投票:0回答:1

考虑两个列表中的按元素加/减/乘/除运算。我的代码如下。

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
,我想知道这是否是正确的方法?代码足够通用吗?

c# list performance linq generics
1个回答
1
投票

我建议在这里使用通用数学,例如

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>();
}
© www.soinside.com 2019 - 2024. All rights reserved.