使用对象和值赋值的委托方法签名
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;
}
}
}
但是,有一些警告:
- 假设是如果 listValue 包含的值少于 listObject,则只有前几对将传入函数;
- linq 系统易于使用但性能不佳,因此如果您不需要在 linq 链中使用此扩展方法,最好的选择是使用没有 yield 的简单 void 方法。
事实上我没有使用“.Count()”方法(例如检查两个列表是否具有相同的长度),因为在最坏的情况下它会强制评估所有项目。
提示:如果您使用的是 .NET 6,对于 null checks 您可以使用
ArgumentNullException.ThrowIfNull(listObject);
而不是显式的 if 和 throw
我正在尝试制作一个类似于@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;
}
}
}
但是,有一些警告:
- 假设是如果 listValue 包含的值少于 listObject,则只有前几对将传入函数;
- linq 系统易于使用但性能不佳,因此如果您不需要在 linq 链中使用此扩展方法,最好的选择是使用没有 yield 的简单 void 方法。
事实上我没有使用“.Count()”方法(例如检查两个列表是否具有相同的长度),因为在最坏的情况下它会强制评估所有项目。
提示:如果您使用的是 .NET 6,对于 null checks 您可以使用
ArgumentNullException.ThrowIfNull(listObject);
而不是显式的 if 和 throw