tipos programacion metodos metodo llamar funciones estructura consola clases c# linq lambda generics

programacion - metodos y funciones en c#



llamar a una función para cada valor en una colección genérica de c# (8)

¡Ladrar! Puede usar List.ForEach pero el problema es que funciona solo para la lista (para asegurarse de que puede cambiar todo a una lista sobre la marcha, pero menos código es más divertido :) ). Además, debe usar la predicción de Action<> que no proporciona ningún tipo de devolución.

De todos modos, hay una respuesta para lo que querías, puedes hacerlo posible de la misma manera que adivinaste con Func<> pero con un pequeño truco como el siguiente:

Haré todo aquí sobre la marcha:

string[] items = (new string[] { "d", "f" }). Select(x => new Func<string>(() => { //Do something here... Console.WriteLine(x); return x.ToUpper(); } )).Select(t => t.Invoke()).ToArray<string>();

Hay algunos puntos aquí:

En primer lugar , he definido una matriz de cadenas sobre la marcha que puede ser reemplazada por cualquier colección que admita LINQ.

En segundo lugar , se va a declarar dentro de la Select one Func<string> para cada elemento de la matriz dada, ya que se llama x .

( Mire el paréntesis vacío y recuerde que cuando define un Func<type**1**, type**2**, ..., type**n**> siempre el último tipo es el tipo de retorno, por lo tanto cuando escribe solo Func<string> indica una función que no tiene parámetro de entrada y su tipo de retorno es cadena )

Está claro que queremos usar la función sobre la matriz dada (new string[] { "d", "f" }) , y es por eso que defino una función sin parámetro y también he usado la misma variable x dentro de Func<> para referirse a los mismos elementos de la matriz.

En tercer lugar , si no coloca el segundo Seleccionar, entonces tiene una colección de dos funciones que devuelven cadena, y ya tienen sus entradas de la primera matriz. Puede hacer esto y mantener el resultado en una variable anonymous y luego llamar a sus métodos .Invoke . Lo escribo aquí:

var functions = (new string[] { "d", "f" }). Select(x => new Func<string>(() => { //Do something here... Console.WriteLine(x); return x.ToUpper(); })); string[] items = functions.Select(t => t.Invoke()).ToArray<string>();

¡Finalmente , he convertido el resultado en una matriz! ¡Ahora tienes una matriz de cadenas!

Lo siento, se hace largo !! Espero que sea útil.

Tengo una colección de valores enteros en una colección de Lista. Quiero llamar a una función para cada valor en la colección donde uno de los argumentos de la función es un valor de colección. Sin hacer esto en un ciclo foreach ... ¿hay alguna manera de lograr esto con una expresión lambda / linq?

algo así como ... myList.Where(p => myFunc(p.Value)); ?

gracias de antemano, -s


Aquí hay un mini (pero completo) ejemplo.

public class Employee { public string EmployeeNumber { get; set; } public DateTime? HireDate { get; set; } } public class EmployeeCollection : List<Employee> { } private void RunTest() { EmployeeCollection empcoll = new EmployeeCollection(); empcoll.Add(new Employee() { EmployeeNumber = "1111", HireDate = DateTime.Now }); empcoll.Add(new Employee() { EmployeeNumber = "3333", HireDate = DateTime.Now }); empcoll.Add(new Employee() { EmployeeNumber = "2222", HireDate = null }); empcoll.Add(new Employee() { EmployeeNumber = "4444", HireDate = null }); //Here''s the "money" line! empcoll.Where(x => x.HireDate.HasValue == false).ToList().ForEach(item => ReportEmployeeWithMissingHireDate(item.EmployeeNumber)); } private void ReportEmployeeWithMissingHireDate(string employeeNumber) { Console.WriteLine("We need to find a HireDate for ''{0}''!", employeeNumber); }


Como han señalado otros carteles, puede usar List<T>.ForEach .

Sin embargo, puede escribir fácilmente un método de extensión que le permita usar ForEach en cualquier IEnumerable<T>

public static void ForEach<T>(this IEnumerable<T> source, Action<T> action) { foreach(T item in source) action(item); }

Lo que significa que ahora puede hacer:

myList.Where( ... ).ForEach( ... );


LINQ no ayuda aquí, pero puede usar List<T>.ForEach :

Lista <T>. Para cada método

Realiza la acción especificada en cada elemento de la Lista.

Ejemplo:

myList.ForEach(p => myFunc(p));

El valor pasado a la expresión lambda es el elemento de la lista, por lo que en este ejemplo p es un long si myList es una List<long> .


No, si desea llamar a una función para cada elemento de una lista, debe llamar a la función para cada elemento de la lista.

Sin embargo, puede usar el método IList<T>.ForEach() como un poco de azúcar sintáctico para hacer que el "extremo comercial" del código sea más legible, de esta manera:

items.ForEach(item => DoSomething(item));



Puede usar el método List.ForEach, como tal:

myList.ForEach(p => myFunc(p));


Si no quiere utilizar el método ForEach de L ist<T> , sino que usa IEnumerable<T> (como suele IEnumerable<T> cuando "LINQ: ing"), sugiero MoreLINQ escrito por Jon Skeet, et al. .

MoreLINQ le dará ForEach, y también Pipe (y un montón de otros métodos), que realiza una acción en cada elemento, pero devuelve el mismo IEnumerable<T> (en comparación con void).