Манипуляция списком в С# с использованием 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 наилучшим образом.
Ответы
Ответ 1
Все сказанное leppie - плюс:
int index = mylist.FindIndex(p => p.id == 1);
if(index<0) {
mylist.Add(car3);
} else {
mylist[index] = car3;
}
Это просто использует существующий FindIndex, чтобы найти автомобиль с идентификатором 1, а затем заменить или добавить его. Нет LINQ; нет SQL - просто лямбда и List<T>
.
Ответ 2
Если вы хотите сделать обновление для нескольких элементов...
foreach (var f in mylist.FindAll(x => x.id == 1))
{
f.id = car3.id;
f.color = car3.color;
f.make = car3.make;
}
Ответ 3
Это не LINQ2SQL.
Кроме того, LINQ не используется для обновления, только для запроса объектов.
Ответ 4
Вы можете использовать этот способ:
(from car in mylist
where car.id == 1
select car).Update(
car => car.id = 3);
Моя ссылка этот сайт. Или следующий код для метода Update
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);
}
}
}
Ответ 5
Как сказал Леппи, LINQ предназначен для запросов, а не для обновления. Однако это можно использовать для создания нового списка:
mylist = new List<Car>(from car in mylist select car.id == 1? car3 : car)
То есть, если вы хотите использовать LINQ. Это хороший и короткий код, конечно, но немного менее эффективный, чем предложение Марка Гравелла, поскольку он эффективно создает новый список, а не обновляет старый.
Ответ 6
//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";
Ответ 7
Только один вопрос, почему мне нужно написать функцию обновления для чего-то, что кажется таким основным для списка? Должны быть стандартные методы для таких списков, как Add(), Delete(), Edit(), Insert(), Replace().... Find()
Ответ 8
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());