提问者:小点点

具有对象和值赋值的委托方法签名


我试图做一个类似于使用LINQ的Zip中所示的IENumable扩展,带有一个不返回@Hakakou值的闭包,但是我试图修改它以运行第一个值的方法,第二个值作为参数。

例如:

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

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


共1个答案

匿名用户

如果您打算创建一个新的linq风格的方法扩展,我认为您必须使用以下代码:

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,则函数中只传递前几对值

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

提示:如果您正在使用。NET 6,对于可以使用的空检查

ArgumentNullException.ThrowIfNull(listObject);

而不是明确的如果和扔