Pergunta sobre c#, stringbuilder, lambda, linq – LINQ para anexar a um StringBuilder de um String []

6

Eu tenho uma matriz de String que eu estou querendo adicionar a um construtor de string por meio de LINQ.

O que estou basicamente tentando dizer é "Para cada item dessa matriz, anexe uma linha a este StringBuilder".

Eu posso fazer isso com bastante facilidade usando um loop foreach no entanto, o código a seguir não parece fazer nada. o que estou perdendo?

stringArray.Select(x => stringBuilder.AppendLine(x));

Onde como isso funciona:

foreach(String item in stringArray)
{
  stringBuilder.AppendLine(item);
}
Eu não usaria o comando .Select ... O comando ForEach não está disponível? sebagomez
Eu renomeie StringBuilder e StringArray para usar um primeiro caractere minúsculo. Só para deixar claro que estou me referindo a variáveis ​​de instância e não a tipos. Jamie Dixon

Sua resposta

3   a resposta
4

Use o método de extensão "ForEach" em vez de "Select".

stringArray.ForEach(x => stringBuilder.AppendLine(x));
18

Se você insistir em fazê-lo de uma maneira LINQy:

StringBuilder builder = StringArray.Aggregate(
                            new StringBuilder(),
                            (sb, s) => sb.AppendLine(s)
                        );

Alternativamente, comoLucas apontou em um comentário em outro post, você poderia dizer

Array.ForEach(StringArray, s => stringBuilder.AppendLine(s));

O motivo queSelect não funciona é porqueSelect é para projetar e criar umIEnumerable da projeção. Então a linha de código

StringArray.Select(s => stringBuilder.AppendLine(s))

não itera sobre oStringArray chamandostringBuilder.AppendLine(s) em cada iteração. Em vez disso, cria umaIEnumerable<StringBuilder> que pode ser enumerado.

Eu suponho que você poderia dizer

var e = stringArray.Select(x => stringBuilder.AppendLine(x));
StringBuilder sb = e.Last();
Console.WriteLine(sb.ToString());

mas isso é realmente horrível.

É Last () garantido para iterar? Em vez de apenas buscar stringArray [stringArray.count-1]? Eu acho que teria preferido ToList (); Taemyr
Obrigado Jason. Sua resposta explica porque o método Select não alcançou o resultado que eu queria e porque o foreach estava funcionando. Eu vou ficar com o foreach. Eu estava realmente apenas curioso sobre o que estava perdendo. Agora eu sei. Jamie Dixon
-1
stringArray.DoForAll(x => StringBuilder.AppendLine(x));

Onde,DoForAll é um método de extensão:

public static class CommonExtensions 
{ 
    public static void DoForAll<T>(this IEnumerable<T> items, Action<T> action) where T: class 
    { 
        if (action == null) 
            throw new ArgumentNullException("action"); 
        foreach (var item in items) 
            action(item);   
    }
} 
O que éDoForAll? jason
Desculpe, eu tive esse método de extensão por tanto tempo, eu esqueci não faz parte do quadro. public static class CommonExtensions {public static void DoForAll <T> (este IEnumerable <T> itens, Action <T> action) onde T: class {if (action == null) lança novo ArgumentNullException ("action"); foreach (var item em itens) action (item); }} vladhorby
@vladhorby: Uma visão sobre o porquêDoForAll e outras extensões equivalentes não são implementadas:blogs.msdn.com/ericlippert/archive/2009/05/18/… jason

Perguntas relacionadas