Как я могу выполнить итерации по набору и изменить значения с дополнительными методами LINQ?

Позволяет говорят, что у меня есть набор сообщений, который имеет свойства "UserID" (интервал) и "Непрочитанный" (bool).

Как я могу использовать дополнительные методы LINQ для установки Непрочитанный = ложь для какого-либо сообщения в наборе в чей UserID = 5?

Так, я знаю, что могу сделать что-то как:

messages.Any(m => m.UserID == 5);

Но, как я устанавливаю свойство Unread каждого из тех, которые имеют дополнительный метод также?

Примечание: Я знаю, что не должен делать этого в производственном коде. Я просто пытаюсь изучить еще немного LINQ-fu.

9
задан SLaks 30 December 2009 в 16:52
поделиться

5 ответов

На самом деле, это возможно, используя только встроенные методы LINQ-расширений без ToList.
. Я считаю, что это будет очень похоже на обычный цикл для . (Я не проверял)

Не смейте осмеливаться делать это в реальном коде.

messages.Where(m => m.UserID == 5)
        .Aggregate(0, (m, r) => { m.Unread = false; return r + 1; });

В качестве добавленного бонуса это вернёт количество пользователей, которых он модифицировал.

.
6
ответ дан 4 December 2019 в 10:32
поделиться

messages.Where(m => m.UserID == 5).ToList().ForEach(m => m.Unread = false);

Then submit the changes.

.
5
ответ дан 4 December 2019 в 10:32
поделиться

Стандартные методы расширения LINQ не включают методы, нацеленные на побочные эффекты. Однако вы можете реализовать его самостоятельно или использовать из Reactive Extensions for .NET (Rx) так:

messages.Where(m => m.UserID == 5).Run(m => m.Unread = false);
4
ответ дан 4 December 2019 в 10:32
поделиться

С LINQ нельзя, потому что LINQ - это язык запросов/расширение. Однако есть проект под названием MoreLinq, который определяет метод расширения под названием ForEach, который позволяет передать действие, которое будет выполняться над каждым элементом.

Таким образом, вы можете сделать с MoreLinq:

messages.Where(m => m.UserID == 5).ForEach(m => m.Unread = false);

Best Regards,
. Оливер Ханаппи

2
ответ дан 4 December 2019 в 10:32
поделиться
[

] Так как не существует явного метода расширения, который делает []ForEach[], вы застряли либо с использованием вторичной библиотеки, либо с самостоятельным написанием заявления фораха. [

]. [
foreach (Message msg in messages.Where(m => m.UserID == 5))
{
    msg.Unread = false;
}
] [

] Если вы действительно хотите использовать оператор Linq для этого, создайте копию коллекции, используя метод []ToList()[], обратившись к методу []ForEach()[] типа []List[]:[

]. [
messages.Where(m => m.UserID == 5).ToList().ForEach(m => m.Unread = false);
] [

] или поместите побочный эффект в [] Where()[] утверждение:[

]. [
messages.Where(m =>
{
    if (m.UserID == 5) { m.Unread = false; return true; }
    return false;
});
] [

] В любом случае, Я предпочитаю использовать явный цикл []foreach[], так как он не делает ненужных копий и более понятен, чем [] Where[] hack.[

].
3
ответ дан 4 December 2019 в 10:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: