Управление списком в C # с использованием Linq

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; }

    }
}

Как я могу обновить список, заменив автомобиль Honda Id 1 на автомобиль Honda с Id 3 наилучшим образом.

12.12.2008 04:47:30
8 ОТВЕТОВ
РЕШЕНИЕ

Все, что сказал Леппи - плюс:

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

Это просто использует существующий FindIndex, чтобы найти автомобиль с идентификатором 1, а затем заменить или добавить его. Нет LINQ; нет SQL - только лямбда и List<T>.

53
12.12.2008 04:56:46
Спасибо, что просветили меня.
Learner 12.12.2008 05:07:17
если у меня будет ссылка SelectedCarна автомобиль, indexбудет ли эта ссылка нарушена или теперь она SelectedCarбудет указывать на автомобиль car3?
Philippe Lavoie 21.02.2011 20:15:50
это класс, так же машина. Отличается для структур, однако
Marc Gravell♦ 21.02.2011 20:35:58
Хотел добавить к этому уведомление: если вы не НАЧИНАЕТЕ с какого-либо Listобъекта, вы должны сначала использовать .ToList()или что-то подобное, FindIndex - это метод List, а не метод Collection или Array (или другой универсальный).
Nevyn 30.11.2012 16:00:38

Это не LINQ2SQL.

Кроме того, LINQ не используется для обновления, только для запроса объектов.

8
12.12.2008 04:51:45

Если вы хотите обновить несколько элементов ...

foreach (var f in mylist.FindAll(x => x.id == 1))  
{    
    f.id = car3.id;  
    f.color = car3.color;  
    f.make = car3.make;  
}  
9
12.12.2008 05:14:24

Вы можете использовать этот способ:

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

Моя ссылка на этот сайт . Или следующий код для метода обновления

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);
        }
    }
}
6
12.12.2008 05:18:43
+1. Это потрясающая ссылка. Я не знаю, что мне нравится больше, насколько лаконичен конечный код или тщательность статьи.
Joseph Ferris 20.07.2009 14:23:25
-1 Update- это то же самое, что List <T> ForEach. Есть причина, по которой ForEach не был включен в IEnumerable .
BlueRaja - Danny Pflughoeft 20.05.2010 16:05:42

Как сказал Леппи, LINQ для запросов, а не обновления. Тем не менее, это может быть использовано для создания нового списка:

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

Это если вы хотите использовать LINQ. Конечно, это хороший и короткий код, но он немного менее эффективен, чем предложение Марка Гравелла, поскольку он создает новый список, а не обновляет старый.

2
12.12.2008 06:00:06
Прекрасный ответ. Я искал краткий способ вернуть список строк, выбрав определенное строковое поле из списка объектов, и ваш подход работал отлично. UpVoted.
Robert Oschler 22.03.2013 22:28:02
//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";
2
29.06.2011 10:37:24

Только один вопрос, почему я должен написать функцию обновления для чего-то, что кажется таким базовым для списка? Должны быть стандартные методы для списков, такие как Add (), Delete (), Edit (), Insert (), Replace () .... Find ()

1
20.05.2010 15:59:22
Список имеет все эти вещи . IList нет, потому что они хотели сделать интерфейс простым для реализации для других. Конечно, теперь, когда у нас есть методы расширения, эти вещи можно перенести в IList . Также: пожалуйста, используйте комментарии для такого рода комментариев в будущем.
BlueRaja - Danny Pflughoeft 20.05.2010 16:12:14
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());
1
29.06.2011 10:37:40