Tengo una lista de objetos y me gustaría actualizar un miembro en particular de la variable dentro de uno de los objetos. Entiendo LINQ está diseñado para la consulta y no con la intención de actualizar las listas de datos inmutables. ¿Cuál sería la mejor manera de lograr esto? No necesito usar LINQ para la solución si no es la más eficiente.

Sería la creación de una Actualización de la extensión del método de trabajo? Si es así ¿cómo puedo hacerlo?

EXAMPLE:
(from trade in CrudeBalancedList
 where trade.Date.Month == monthIndex
 select trade).Update(
 trade => trade.Buy += optionQty);
Vi esta entrada y sentía un vínculo sería adecuado para cualquier persona en busca de mi pregunta. stackoverflow.com/questions/1344140/…

OriginalEl autor Addie | 2010-03-15

4 Comentarios

  1. 30

    Aunque linq no está destinado a la actualización de las listas de datos inmutables, es muy útil para conseguir los elementos que desea actualizar. Creo que para que esto sería:

    (from trade in CrudeBalancedList
        where trade.Date.Month == monthIndex
        select trade).ToList().ForEach( trade => trade.Buy += optionQty);
    Esto generará una nueva lista actualizada o actualizar CrudeBalancedList?
    En el punto de la ToList() método al que se llama, no es una lista de los objetos que cumplan los criterios. No hay ninguna variable para esta lista, por lo que será un objetivo para la recolección de basura tan pronto como se ejecuta esta línea. Si usted quisiera utilizar esta lista para algo más que hacer [el comercio.Comprar += optionQty], entonces usted desea separar esta línea de código a varios otros. En primer lugar, defina y establezca una variable así: Lista de<comercial> monthlyCrudeBalancedList = (a partir de comercio, etc. Luego, a la siguiente línea: monthlyCrudeBalancedList.ForEach( comercio => etc. Entonces, usted tiene un de referencia de la nueva lista.

    OriginalEl autor Patrick Karcher

  2. 4

    No estoy seguro de si esta es la mejor manera, pero te permitirá actualizar un elemento de la lista.

    El objeto de prueba:

     public class SomeClass {
            public int Value { get; set; }
            public DateTime Date { get; set; }
        }

    El método de extensión:

    public static class Extension {
            public static void Update<T>(this T item, Action<T> updateAction) {
                updateAction(item);
            }
        }

    La prueba:

    public void Test()
    {
        //test data
        List<SomeClass> list = new List<SomeClass>()
        {
            new SomeClass {Value = 1, Date = DateTime.Now.AddDays(-1)},
            new SomeClass {Value = 2, Date = DateTime.Now },
            new SomeClass {Value = 3, Date = DateTime.Now.AddDays(1)}
        };
        //query and update
        (from i in list where i.Date.Day.Equals(DateTime.Now.Day) select i).First().Update(v => v.Value += 5);
    
        foreach (SomeClass s in list) {
            Console.WriteLine(s.Value);
        }
    }
    o puedes hacerlo como: (from i in list where i.Date.Day.Equals(DateTime.Now.Day) select i).First().Value+=4;

    OriginalEl autor Fernando

  3. 1

    Así que usted está esperando para obtener un resultado único aquí. En ese caso, usted podría considerar la posibilidad de utilizar el SingleOrDefault método:

    var record =
        (from trade in CrudeBalancedList
        where trade.Date.Month == monthIndex
        select trade).SingleOrDefault();
    
    if (record != null)
        record.Buy += optionQty;

    Tenga en cuenta que el SingleOrDefault método espera que haya exactamente uno o cero valor devuelto (como una fila en una tabla para algunos la única clave principal). Si hay más de un registro se devuelve, el método arrojará una excepción.

    O uso similar FirstOrDefault método. No va a lanzar una excepción si hay más de un registro se devuelve.

    OriginalEl autor Dan Tao

  4. 0

    Para crear un método, usted podría comenzar con su prototipo:

    public static class UpdateEx {
        public void Update(this IEnumerable<T> items, 
                           Expression<Action> updateAction) {
        }
    }

    Esa es la parte fácil.

    La parte difícil será para compilar la Expression<Action> en una instrucción SQL update. Dependiendo de cuánto sintaxis desea apoyar, un compilador de la complejidad puede variar desde trivial imposible.

    Para un ejemplo de compilación de Expresiones Linq, ver la TableQuery clase de la sqlite-proyecto de red de.

    OriginalEl autor Frank Krueger

Dejar respuesta

Please enter your comment!
Please enter your name here