Позволяет говорят, что у меня есть набор сообщений, который имеет свойства "UserID" (интервал) и "Непрочитанный" (bool).
Как я могу использовать дополнительные методы LINQ для установки Непрочитанный = ложь для какого-либо сообщения в наборе в чей UserID = 5?
Так, я знаю, что могу сделать что-то как:
messages.Any(m => m.UserID == 5);
Но, как я устанавливаю свойство Unread каждого из тех, которые имеют дополнительный метод также?
Примечание: Я знаю, что не должен делать этого в производственном коде. Я просто пытаюсь изучить еще немного LINQ-fu.
На самом деле, это возможно, используя только встроенные методы LINQ-расширений без ToList
.
.
Я считаю, что это будет очень похоже на обычный цикл для
. (Я не проверял)
Не смейте осмеливаться делать это в реальном коде.
messages.Where(m => m.UserID == 5)
.Aggregate(0, (m, r) => { m.Unread = false; return r + 1; });
В качестве добавленного бонуса это вернёт количество пользователей, которых он модифицировал.
.messages.Where(m => m.UserID == 5).ToList().ForEach(m => m.Unread = false);
Then submit the changes.
.Стандартные методы расширения LINQ не включают методы, нацеленные на побочные эффекты. Однако вы можете реализовать его самостоятельно или использовать из Reactive Extensions for .NET (Rx) так:
messages.Where(m => m.UserID == 5).Run(m => m.Unread = false);
С LINQ нельзя, потому что LINQ - это язык запросов/расширение. Однако есть проект под названием MoreLinq, который определяет метод расширения под названием ForEach, который позволяет передать действие, которое будет выполняться над каждым элементом.
Таким образом, вы можете сделать с MoreLinq:
messages.Where(m => m.UserID == 5).ForEach(m => m.Unread = false);
Best Regards,
.
Оливер Ханаппи
] Так как не существует явного метода расширения, который делает []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.[