使用对象和值赋值的委托方法签名

Delegate method signature with object and value assignment

我正在尝试制作一个类似于@Hakakou Using LINQ's Zip with a closure that doesn't return a value 中所示的 IEnumerable 扩展,但是我正在尝试将其修改为 运行 第一个值的方法,其中第二个值作为参数。

例如:

public class MyObject {

  private int myInt;

  public MyObject(int a){
    myInt = a;
  }

  public void addToFloat(int b){
    myInt += b;
  }

}

List<MyObject> objList = new List<ObjList> {new MyObj(5), new MyObj(8)};
List<int> intList = new List<int> {3, 1};

objList.MyExtension(intList, addToFloat)

// Now both MyObjects should have myInt set to 8 and 9 respectively

但是我不确定如何从对象中 'separate' 方法并保存其签名,然后能够将其应用于具有给定值的每个对象实例。

如果您打算创建一个新的 linq-style 方法扩展,我认为您必须使用此代码:

static class MyExtensionClass
{
    public static IEnumerable<TObj> MyExtension<TObj, TValue>(this IEnumerable<TObj> listObject, IEnumerable<TValue> listValue, Action<TObj, TValue> fun)
    {
        if (listObjectis null)
            throw new ArgumentNullException(nameof(listObject));
        if (listValue is null)
            throw new ArgumentNullException(nameof(listValue));
        if (fun is null)
            throw new ArgumentNullException(nameof(fun));
    
        using var enumerator = listValue.GetEnumerator();
        foreach (var obj in listObject)
        {
            if (!enumerator.MoveNext())
                fun(obj, enumerator.Current);
            yield return obj;
        }
    }
}

但是,有一些警告:

  1. 假设是如果 listValue 包含的值少于 listObject,则只有前几对将传入函数;
  2. linq 系统易于使用但性能不佳,因此如果您不需要在 linq 链中使用此扩展方法,最好的选择是使用没有 yield 的简单 void 方法。

事实上我没有使用“.Count()”方法(例如检查两个列表是否具有相同的长度),因为在最坏的情况下它会强制评估所有项目。

提示:如果您使用的是 .NET 6,对于 null checks 您可以使用

ArgumentNullException.ThrowIfNull(listObject);

而不是显式的 if 和 throw