¿Hay alguna manera de hacer lo siguiente usando LINQ?
foreach (var c in collection)
{
c.PropertyToSet = value;
}
Para aclarar, quiero iterar a través de cada objeto en una colección y luego actualizar una propiedad en cada objeto.
Mi caso de uso es que tengo un montón de comentarios en una publicación de blog, y quiero repetir cada comentario en una publicación de blog y establecer la fecha y hora en la publicación del blog en +10 horas. Podría hacerlo en SQL, pero quiero mantenerlo en la capa empresarial.
Respuestas:
Si bien puede usar un
ForEach
método de extensión, si desea usar solo el marco, puede hacerloSe
ToList
necesita para evaluar la selección inmediatamente debido a una evaluación diferida .fuente
ObservableCollection
voz, entonces puede ser útil cambiar los elementos en lugar de crear una nueva lista.fuente
collection.ToList().ForEach(c => { c.Property1ToSet = value1; c.Property2ToSet = value2; });
collection.ToList().ForEach(c => { collection[collection.IndexOf(c)] = new <struct type>() { <propertyToSet> = value, <propertyToRetain> = c.Property2Retain }; });
yo estoy haciendo esto
fuente
All()
método de extensión, lo que lleva a una posible confusión cuando alguien más lee el código.List<>
esa, elForEach()
método es una forma mucho menos críptica de lograr esto. exForEach(c => { c.needsChange = value; })
En realidad encontré un método de extensión que hará bien lo que quiero
fuente
foreach
bucle (por cualquier razón).foreach
ya que el código en sí contiene elforeach
bucleUtilizar:
No estoy seguro de si esto está utilizando LINQ en exceso o no, pero me ha funcionado cuando quiero actualizar un elemento específico de la lista para una condición específica.
fuente
No hay un método de extensión incorporado para hacer esto. Aunque definir uno es bastante sencillo. Al final de la publicación hay un método que definí llamado Iterate. Se puede usar así
Fuente iterada
fuente
Aunque solicitó específicamente una solución LINQ y esta pregunta es bastante antigua, publico una solución que no es LINQ. Esto se debe a que LINQ (= consulta integrada en el idioma ) está destinado a ser utilizado para consultas en colecciones. Todos los métodos LINQ no modifican la colección subyacente, solo devuelven una nueva (o un iterador más preciso a una nueva colección). Por lo tanto, hagas lo que hagas, por ejemplo, con un
Select
no afecta la colección subyacente, simplemente obtienes una nueva.Por supuesto, podría hacerlo con un
ForEach
(que no es LINQ, por cierto, sino una extensión activadaList<T>
). Pero esto literalmente se usa deforeach
todos modos, pero con una expresión lambda. Aparte de esto, cada método LINQ itera internamente su colección, por ejemplo, utilizandoforeach
ofor
, sin embargo, simplemente la oculta del cliente. No considero que esto sea más legible ni mantenible (piense en editar su código mientras depura un método que contiene expresiones lambda).Dicho esto, no debería usar LINQ para modificar elementos en su colección. Una mejor manera es la solución que ya proporcionó en su pregunta. Con un bucle clásico, puede iterar fácilmente su colección y actualizar sus elementos. De hecho, todas esas soluciones en las que se basan
List.ForEach
no son nada diferentes, pero son mucho más difíciles de leer desde mi perspectiva.Por lo tanto, no debe usar LINQ en aquellos casos en los que desea actualizar los elementos de su colección.
fuente
for
bucle "bajo el capó". Siento que es azúcar sintético crear formas menos detalladas de realizar tareas simples, no ser un reemplazo para la codificación estándar.He intentado algunas variaciones sobre esto, y sigo volviendo a la solución de este tipo.
http://www.hookedonlinq.com/UpdateOperator.ashx
Nuevamente, esta es la solución de otra persona. Pero he compilado el código en una pequeña biblioteca y lo uso con bastante regularidad.
Voy a pegar su código aquí, por la posibilidad de que su sitio (blog) deje de existir en algún momento en el futuro. (No hay nada peor que ver una publicación que dice "Aquí está la respuesta exacta que necesita", Click y Dead URL).
fuente
Action<TSource>
lugar de crear un delegado adicional. Sin embargo, eso podría no haber estado disponible al momento de escribir eso.where T: struct
, detectar esto en tiempo de compilación.No, LINQ no admite una forma de actualización masiva. La única forma más corta sería utilizar un
ForEach
método de extensión: ¿por qué no hay un método de extensión ForEach en IEnumerable?fuente
Escribí algunos métodos de extensión para ayudarme con eso.
Lo estoy usando así:
Como referencia, el argumento verifica:
fuente
Mis 2 centavos: -
fuente
Puede usar LINQ para convertir su colección en una matriz y luego invocar Array.ForEach ():
Obviamente, esto no funcionará con colecciones de estructuras o tipos incorporados como enteros o cadenas.
fuente
Aquí está el método de extensión que uso ...
fuente
List<T>.ForEach
también hace, pero solo para todosIEnumerable
.Supongo que desea cambiar los valores dentro de una consulta para poder escribir una función para ella
Pero no estoy seguro si esto es lo que quieres decir.
fuente
Puede usar Magiq , un marco de trabajo por lotes para LINQ.
fuente
Supongamos que tenemos datos como a continuación,
y si queremos modificar la lista y reemplazar los valores existentes de la lista por valores modificados, primero creemos una nueva lista vacía, luego recorramos la lista de datos invocando el método de modificación en cada elemento de la lista,
fuente