我试图做一个类似于使用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
然而,我不确定如何将方法从对象中分离出来并保存其签名,然后能够将其应用于具有给定值的每个对象实例。
如果您打算创建一个新的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;
}
}
}
但是,也有一些警告:
事实上,我没有使用“.Count()”方法(例如,检查两个列表是否具有相同的长度),因为在最坏的情况下,它将强制计算所有项。
提示:如果您正在使用。NET 6,对于可以使用的空检查
ArgumentNullException.ThrowIfNull(listObject);
而不是明确的如果和扔