Модификация последовательности
От: Qt-Coder  
Дата: 22.11.24 05:12
Оценка:
Продолжаю изучать 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;
Отредактировано 22.11.2024 5:13 Qt-Coder . Предыдущая версия .
Re: Модификация последовательности
От: Sharov Россия  
Дата: 22.11.24 08:26
Оценка:
Здравствуйте, 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 в стандартной библиотеке, либо несложно сделать самому.
Кодом людям нужно помогать!
Re: Модификация последовательности
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.11.24 12:11
Оценка: 6 (1) +2
Здравствуйте, Qt-Coder, Вы писали:

QC>Как это записать в 1 строчку в стиле запросов в LINQ?


Это не надо делать в стиле LINQ. LINQ — это поддержка функционального программирования (ФП) в C#. А ФП подразумевает не модификацию имеющихся данных, а порождение новых.

Так что твой пример на LINQ в правильном (хех, по фрешую) исполнении будет выглядеть так:
var smth2 = smth.Select(s => s with { field1 = "", field2 = 10 });
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Отредактировано 22.11.2024 16:38 VladD2 . Предыдущая версия . Еще …
Отредактировано 22.11.2024 16:38 VladD2 . Предыдущая версия .
Re: Модификация последовательности
От: _NN_ www.nemerleweb.com
Дата: 23.11.24 05:24
Оценка: 6 (1)
Здравствуйте, Qt-Coder, Вы писали:

QC>Продолжаю изучать C#.

QC>C# 6.0 MSVS 2015
В 2024-м можно уже и с VS2022 начинать

Не добавили потому как императивная операция, которая уже есть в языке.
Для справки: foreach vs ForEach.

Если очень надо, всё сделано за нас в библиотеках как: System.Interactive.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Модификация последовательности
От: Qt-Coder  
Дата: 23.11.24 05:33
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Здравствуйте, Qt-Coder, Вы писали:


QC>>Продолжаю изучать C#.

QC>>C# 6.0 MSVS 2015
_NN>В 2024-м можно уже и с VS2022 начинать
Я ж не по своей воле начал )) Работодатель ограничивает 2015-й

_NN>Не добавили потому как императивная операция, которая уже есть в языке.

_NN>Для справки: foreach vs ForEach.
Спасибо
Re: Модификация последовательности
От: Sinclair Россия https://github.com/evilguest/
Дата: 23.11.24 08:51
Оценка:
Здравствуйте, 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.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[3]: Модификация последовательности
От: _NN_ www.nemerleweb.com
Дата: 24.11.24 18:43
Оценка:
Здравствуйте, 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>Спасибо
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.