Existe uma maneira de fazer o seguinte usando o LINQ?
foreach (var c in collection)
{
c.PropertyToSet = value;
}
Para esclarecer, desejo percorrer cada objeto em uma coleção e atualizar uma propriedade em cada objeto.
Meu caso de uso é que tenho vários comentários em uma postagem do blog e quero percorrer cada comentário em uma postagem do blog e definir a data e hora da postagem do blog como +10 horas. Eu poderia fazer isso no SQL, mas quero mantê-lo na camada de negócios.
Respostas:
Embora você possa usar um
ForEach
método de extensão, se quiser usar apenas a estrutura, poderáA
ToList
é necessária, a fim de avaliar a escolha de imediato devido à avaliação preguiçosa .fonte
ObservableCollection
palavra a dizer, pode ser útil alterar os itens no lugar, em vez de criar uma nova lista.fonte
collection.ToList().ForEach(c => { c.Property1ToSet = value1; c.Property2ToSet = value2; });
collection.ToList().ForEach(c => { collection[collection.IndexOf(c)] = new <struct type>() { <propertyToSet> = value, <propertyToRetain> = c.Property2Retain }; });
Estou fazendo isso
fonte
All()
método de extensão, levando a possíveis confusões quando alguém lê o código.List<>
essa, oForEach()
método é uma maneira muito menos enigmática de fazer isso. exForEach(c => { c.needsChange = value; })
Na verdade, eu encontrei um método de extensão que fará o que eu quero bem
fonte
foreach
loop (por qualquer motivo).foreach
que o próprio código contém oforeach
circuitoUsar:
Não tenho certeza se isso está usando muito o LINQ ou não, mas funcionou para mim ao querer atualizar itens específicos da lista para uma condição específica.
fonte
Não há método de extensão interno para fazer isso. Embora definir um seja bastante direto. Na parte inferior da postagem há um método que eu defini chamado Iterate. Pode ser usado assim
Iterar Origem
fonte
Embora você tenha solicitado especificamente uma solução LINQ e essa pergunta seja bastante antiga, eu posto uma solução não-LINQ. Isso ocorre porque o LINQ (= consulta integrada ao idioma ) deve ser usado para consultas em coleções. Todos os métodos LINQ não modificam a coleção subjacente, apenas retornam uma nova (ou um iterador mais preciso para uma nova coleção). Assim, o que você faz, por exemplo, com a
Select
não afeta a coleção subjacente, você simplesmente obtém uma nova.Claro que você pode fazer isso com um
ForEach
(que não é LINQ, a propósito, mas uma extensão ativadaList<T>
). Mas isso literalmente usa deforeach
qualquer maneira, mas com uma expressão lambda. Além disso, todo método LINQ interage internamente sua coleção, por exemplo, usandoforeach
oufor
, no entanto, simplesmente a oculta do cliente. Eu não considero isso mais legível nem sustentável (pense em editar seu código enquanto depura um método que contém expressões lambda).Dito isto, não deve usar o LINQ para modificar itens em sua coleção. Uma maneira melhor é a solução que você já forneceu na sua pergunta. Com um loop clássico, você pode facilmente iterar sua coleção e atualizar seus itens. De fato, todas essas soluções baseadas em
List.ForEach
não são nada diferentes, mas muito mais difíceis de ler da minha perspectiva.Portanto, você não deve usar o LINQ nos casos em que deseja atualizar os elementos da sua coleção.
fonte
for
loop "sob o capô". Eu acho que é um açúcar sintático criar maneiras menos detalhadas de realizar tarefas simples, para não substituir a codificação padrão.Eu tentei algumas variações e continuo voltando à solução desse cara.
http://www.hookedonlinq.com/UpdateOperator.ashx
Novamente, esta é a solução de outra pessoa. Mas compilei o código em uma pequena biblioteca e o uso com bastante regularidade.
Vou colar o código dele aqui, para a chance de que seu site (blog) deixe de existir em algum momento no futuro. (Não há nada pior do que ver uma postagem que diz "Aqui está a resposta exata de que você precisa", Clique e URL morto.)
fonte
Action<TSource>
vez de criar um delegado extra. Isso pode não estar disponível no momento em que escrevemos isso.where T: struct
, capturar isso em tempo de compilação.Não, o LINQ não suporta uma maneira de atualização em massa. A única maneira mais curta seria usar um
ForEach
método de extensão - Por que não existe o método de extensão ForEach no IEnumerable?fonte
Eu escrevi alguns métodos de extensão para me ajudar com isso.
Estou usando assim:
Para referência ao argumento, verifique:
fonte
Meus 2 centavos: -
fonte
Você pode usar o LINQ para converter sua coleção em uma matriz e depois chamar Array.ForEach ():
Obviamente, isso não funcionará com coleções de estruturas ou tipos embutidos, como números inteiros ou cadeias.
fonte
Aqui está o método de extensão que eu uso ...
fonte
List<T>.ForEach
também faz, mas apenas para todosIEnumerable
.Eu suponho que você queira alterar valores dentro de uma consulta para poder escrever uma função para ela
Mas não se preocupe se é isso que você quer dizer.
fonte
Você pode usar o Magiq , uma estrutura de operação em lote para o LINQ.
fonte
Suponha que tenhamos dados como abaixo,
e se quisermos modificar a lista e substituir os valores existentes da lista por valores modificados, primeiro crie uma nova lista vazia e, em seguida, percorra a lista de dados chamando o método de modificação em cada item da lista,
fonte