es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Firma del método delegado con asignación de objeto y valor

Estoy tratando de hacer una extensión de IEnumerable similar a la que se muestra en https://stackoverflow.com/questions/11190324/using-linqs-zip-with-a-closure-that-doesnt-return-a-value por @Hakakou, sin embargo, estoy tratando de modificarla para ejecutar un método del primer valor, con el segundo valor como parámetro.

Por ejemplo:

“`C#
public class MyObject {

private int myInt;

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

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

}

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

objList.MyExtension(intList, addToFloat)

// Ahora ambos MyObjects deberían tener myInt configurado en 8 y 9 respectivamente
“`

Sin embargo, no estoy seguro de cómo ‘separar’ un método del objeto y guardar su firma, luego ser capaz de aplicarlo a cada instancia del objeto con un valor dado.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para lograr esto, puedes crear un delegado que encapsule la firma del método que deseas aplicar a los objetos. Luego, en el método de extensión, puedes recorrer cada objeto e invocar el delegado pasando el segundo valor como parámetro. Aquí tienes un ejemplo de cómo se puede hacer:

    “`C#
    public static class EnumerableExtensions {
    public static IEnumerable MyExtension(this IEnumerable source, IEnumerable other, Action<t, int=””> action) {
    var actionDelegate = new Action
    (i => {
    foreach(var item in source) {
    action(item, i);
    }
    });

    other.Zip(Enumerable.Repeat(actionDelegate, other.Count()), (i, a) => a(i)).ToList();
    
    return source;
    

    }
    }


    En este ejemplo, el método de extensión toma el enumerable fuente, el otro enumerable (el que se utilizará como parámetro) y el delegado de acción. La firma del delegado es `Action<t, int="">` porque recibe la instancia del objeto y un parámetro int. Dentro del método, creamos un nuevo delegado (`actionDelegate`) que recorre cada objeto en el enumerable fuente e invoca el delegado de acción con el parámetro int pasado. Luego, utilizamos el método `Zip` para iterar sobre ambas listas simultáneamente, pasando cada valor int y el `actionDelegate` a una función lambda. Finalmente, llamamos a `ToList()` para consumir el enumerable y devolver la fuente modificada. Con este método de extensión, puedes llamarlo de la siguiente manera: ```C# objList.MyExtension(intList, (obj, i) => obj.addToFloat(i));

    En este ejemplo, pasamos una función lambda que llama al método addToFloat de cada instancia de MyObject pasando el valor int como parámetro.</t,></t,>

Comments are closed.