【问题标题】:Delegate method signature with object and value assignment具有对象和值分配的委托方法签名
【发布时间】:2022-01-19 13:31:12
【问题描述】:

我正在尝试制作一个类似于@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

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

【问题讨论】:

    标签: c# linq ienumerable


    【解决方案1】:

    如果你的意图是创建一个新的 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

    【讨论】:

      猜你喜欢
      • 2011-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-01
      • 2011-12-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多