2008-12-12 20 views
27
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Linq.Expressions; 
using System.Text; 

namespace ConsoleApplication1 
{ 

    public class Class1 
    { 
     static void Main(string[] args) 
     { 
      List<Car> mylist = new List<Car>(); 
      Car car1; 
      Car car2; 
      Car car3; 

      car1 = new Car() 
      { 
       make = "Honda", 
       id = 1 
      }; 
      car2 = new Car() 
      { 
       make = "toyota", 
       id = 2 
      }; 

      car3 = new Car() 
      { 
       make = "Honda", 
       id = 3, 
       color = "red" 
      }; 

      mylist.Add(car1); 
      mylist.Add(car2); 
      **////mylist.Where(p => p.id == 1).SingleOrDefault() = car3;** 
     }   
    } 

    public class Car 
    { 
     public int id { get; set; } 
     public string make { get; set; } 
     public string color { get; set; } 

    } 
} 

¿Cómo puedo actualizar la lista reemplazando el Honda de Id 1 con honda con Id 3 de la mejor manera?Manipulación de lista en C# con Linq

Respuesta

53

Todo leppie dijo - y además:

int index = mylist.FindIndex(p => p.id == 1); 
if(index<0) { 
    mylist.Add(car3); 
} else { 
    mylist[index] = car3; 
} 

Esto sólo utiliza el FindIndex existente para localizar un coche con id 1, a continuación, reemplazar o añadirlo. Sin LINQ; sin SQL, solo una lambda y List<T>.

+0

Gracias por iluminarme. – Learner

+1

si tengo una referencia 'SelectedCar' al automóvil en' index' ¿se romperá la referencia o el 'SelectedCar' ahora apuntará al automóvil car3? –

+0

es una clase, por lo que el mismo automóvil. Diferente para estructuras, aunque –

8

Esto no es LINQ2SQL.

Además, LINQ no se utiliza para actualizar, solo para consultar objetos.

9

Si usted quería hacer una actualización de varios elementos ...

foreach (var f in mylist.FindAll(x => x.id == 1)) 
{  
    f.id = car3.id; 
    f.color = car3.color; 
    f.make = car3.make; 
} 
6

Se puede usar esta forma:

(from car in mylist 
where car.id == 1 
select car).Update(
car => car.id = 3); 

Mi referencia es this website. O sigue el código para el método de actualización

public static void Update<T>(this IEnumerable<T> source, params Action<T>[] updates) 
{ 
    if (source == null) 
     throw new ArgumentNullException("source"); 

    if (updates == null) 
     throw new ArgumentNullException("updates"); 

    foreach (T item in source) 
    { 
     foreach (Action<T> update in updates) 
     { 
      update(item); 
     } 
    } 
} 
+0

+1. Ese es un enlace increíble. No sé qué es lo que más me gusta, cuán conciso se vuelve el código resultante o la minuciosidad del artículo. –

+0

-1 'Update' es lo mismo que List' 'ForEach'. Existe una razón por la cual cada [no se incluyó en IEnumerable] (http://blogs.msdn.com/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx). –

2

Como dijo Leppie, LINQ es para realizar consultas en lugar de actualizar. Sin embargo, eso se puede usar para crear una nueva lista:

mylist = new List<Car>(from car in mylist select car.id == 1? car3 : car) 

Esto es así si desea usar LINQ. Es un código bonito y corto, por supuesto, pero un poco menos eficiente que la sugerencia de Marc Gravell, ya que efectivamente crea una nueva lista, en lugar de actualizar la anterior.

+0

Una respuesta maravillosa. Estaba buscando una forma concisa de devolver una lista de cadenas seleccionando un campo de cadena particular de una Lista de objetos, y su enfoque funcionó perfectamente. UpVoted. –

2
//Item class 
Class Item 
{ 
    public string Name { get; set; } 
} 

List <Item> myList = new List<Item>() 

//Add item to list 
Item item = new Item(); 
item.Name = "Name"; 

myList.Add(Item); 

//Find the item with the name prop 

Item item2 = myList.Find(x => x.Name == "Name"); 

if(item2 != null) 
    item.Name = "Changed"; 
1

Solo una pregunta, ¿por qué tengo que escribir una función de actualización para algo que parece tan básico para una lista? Debería haber métodos estándar para listas como Agregar(), Eliminar(), Editar(), Insertar(), Reemplazar() .... Buscar()

+0

La lista tiene [todas esas cosas] (http://msdn.microsoft.com/en-us/library/d9hw1as6.aspx). IList no lo hace, porque querían que la interfaz fuera fácil de implementar para otros. Por supuesto, ahora que tenemos métodos de extensión, estas cosas [se pueden resumir en IList] (https://connect.microsoft.com/VisualStudio/feedback/details/552410/move-lots-of-helpful-methods-from -list-to-ilist-using-extension-methods). Además: utilice comentarios para este tipo de comentarios en el futuro. –

1
List<AvailabilityIssue> ai = new List<AvailabilityIssue>(); 

ai.AddRange(
    (from a in db.CrewLicences 
     where 
      a.ValidationDate <= ((UniversalTime)todayDate.AddDays(30)).Time && 
      a.ValidationDate >= ((UniversalTime)todayDate.AddDays(15)).Time 
     select new AvailabilityIssue() 
     { 
      crewMemberId = a.CrewMemberId, 
      expirationDays = 30, 
      Name = a.LicenceType.Name, 
      expirationDate = new UniversalTime(a.ValidationDate).ToString("yyyy-MM-dd"), 
      documentType = Controllers.rpmdataController.DocumentType.Licence 
     }).ToList());