Продолжаю изучать C#.
C# 6.0 MSVS 2015
Подскажите как модифицировать последовательность.
Делаю так:
List<Smth> smth = ...
foreach (var s in smth)
{
s.field1 = "";
s.field2 = 10;
}
Как это записать в 1 строчку в стиле запросов в LINQ?
Что-то типа (псевдокод)
from s in smth set s.field1 = "", s.field2 = 10;
Здравствуйте, Qt-Coder, Вы писали:
QC>Продолжаю изучать C#.
QC>C# 6.0 MSVS 2015
QC>Подскажите как модифицировать последовательность.
QC>Делаю так:
QC>QC>List<Smth> smth = ...
QC>foreach (var s in smth)
QC>{
QC> s.field1 = "";
QC> s.field2 = 10;
QC>}
QC>
QC>Как это записать в 1 строчку в стиле запросов в LINQ?
QC>Что-то типа (псевдокод)
QC>QC>from s in smth set s.field1 = "", s.field2 = 10;
QC>
https://stackoverflow.com/a/1509491/241446
Вроде есть метод расширения ForEach в стандартной библиотеке, либо несложно сделать самому.
Здравствуйте, Qt-Coder, Вы писали:
QC>Как это записать в 1 строчку в стиле запросов в LINQ?
Это не надо делать в стиле LINQ. LINQ — это поддержка функционального программирования (ФП) в C#. А ФП подразумевает не модификацию имеющихся данных, а порождение новых.
Так что твой пример на LINQ в правильном (хех, по фрешую) исполнении будет выглядеть так:
var smth2 = smth.Select(s => s with { field1 = "", field2 = 10 });
Здравствуйте, Qt-Coder, Вы писали:
QC>Продолжаю изучать C#.
QC>C# 6.0 MSVS 2015
В 2024-м можно уже и с VS2022 начинать
Не добавили потому как императивная операция, которая уже есть в языке.
Для справки:
foreach vs ForEach.
Если очень надо, всё сделано за нас в библиотеках как:
System.Interactive.
Здравствуйте, _NN_, Вы писали:
_NN>Здравствуйте, Qt-Coder, Вы писали:
QC>>Продолжаю изучать C#.
QC>>C# 6.0 MSVS 2015
_NN>В 2024-м можно уже и с VS2022 начинать
Я ж не по своей воле начал )) Работодатель ограничивает 2015-й
_NN>Не добавили потому как императивная операция, которая уже есть в языке.
_NN>Для справки: foreach vs ForEach.
Спасибо
Здравствуйте, Qt-Coder, Вы писали:
QC>Как это записать в 1 строчку
Вот так (
внимание! предполагается, что Smth — это ссылочный тип!):
foreach (var s in smth) (s.field1, s.field2) = ("", 10);
QC>в стиле запросов в LINQ?
Тут пока непонятно, зачем вам тут Linq. Linq полезен там, где вам нужно делать цепочку трансформаций, а не просто "пройти по всем элементам".
Например, если нужно изменить не все элементы, то пишется это
вот так:
foreach (var s in smth.Where(s => s.field2 % 2 == 1)) (s.field1, s.field2) = ("", 10);
или
foreach (var s in from t in smth where t.field2 % 2 == 1 select t)
(s.field1, s.field2) = ("", 10);
Для value-типов такой код в общем случае работать не будет.
https://dotnetfiddle.net/vg6zjL:
Cannot modify members of 's' because it is a 'foreach iteration variable'
Теоретически для коллекций может существовать реф-итератор; но за пределами Span-ов это бывает крайне редко.
https://dotnetfiddle.net/t0QGAn
Видите — пришлось пожертвовать Where. Если раскомментировать закомментированную часть, то компилироваться это перестанет, т.к. у IEnumerable<T> нет конверсии в Span<T>.
Всё это можно побороть, но есть ли в этом смысл?
Лучше посмотрите на то, как вопрос изменений
решён в linq2db.
Здравствуйте, Qt-Coder, Вы писали:
QC>Здравствуйте, _NN_, Вы писали:
_NN>>Здравствуйте, Qt-Coder, Вы писали:
QC>>>Продолжаю изучать C#.
QC>>>C# 6.0 MSVS 2015
_NN>>В 2024-м можно уже и с VS2022 начинать
QC>Я ж не по своей воле начал )) Работодатель ограничивает 2015-й
А ограничение в каком виде ?
Я же полагаю что любой редактор можно или обязаны код редактировать в 2015 и даже условно Блокнотом нельзя?
Нужен .NET 2.0 на выходе? Это и с 2022 можно провернуть.
Нельзя студию новее как редактор? Тогда берём VSCode 2024-го года.
_NN>>Не добавили потому как императивная операция, которая уже есть в языке.
_NN>>Для справки: foreach vs ForEach.
QC>Спасибо