LINQ 从 String[] 附加到 StringBuilder

发布于 2024-08-11 05:28:17 字数 351 浏览 5 评论 0原文

我有一个字符串数组,我想通过 LINQ 将其添加到字符串生成器中。

我基本上想说的是“对于这个数组中的每个项目,向这个 StringBuilder 添加一行”。

我可以使用 foreach 循环轻松地完成此操作,但是以下代码似乎没有执行任何操作。我缺少什么?

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

这在哪里有效:

foreach(String item in stringArray)
{
  stringBuilder.AppendLine(item);
}

I've got a String array that I'm wanting to add to a string builder by way of LINQ.

What I'm basically trying to say is "For each item in this array, append a line to this StringBuilder".

I can do this quite easily using a foreach loop however the following code doesn't seem to do anything. What am I missing?

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

Where as this works:

foreach(String item in stringArray)
{
  stringBuilder.AppendLine(item);
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

萌能量女王 2024-08-18 05:28:17

如果您坚持以 LINQy 方式执行此操作:

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

或者,正如 Luke 在另一篇文章的评论中指出的那样,您可以说

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

Select不起作用的原因是因为Select用于投影并创建投影的IEnumerable。因此,该代码行

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

不会在每次迭代时迭代调用 stringBuilder.AppendLine(s)StringArray。相反,它创建一个可以枚举的 IEnumerable

我想你可能会说,

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

但这真的很可怕。

If you insist on doing it in a LINQy way:

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

Alternatively, as Luke pointed out in a comment on another post, you could say

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

The reason that Select does not work is because Select is for projecting and creating an IEnumerable of the projection. So the line of code

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

does not iterate over the StringArray calling stringBuilder.AppendLine(s) on each iteration. Rather, it creates an IEnumerable<StringBuilder> that can be enumerated over.

I suppose that you could say

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

but that is really hideous.

誰認得朕 2024-08-18 05:28:17

使用“ForEach”扩展方法而不是“Select”。

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

或者

Array.ForEach(stringArray, x => stringBuilder.AppendLine(x));

Use the "ForEach" extension method instead of "Select".

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

or

Array.ForEach(stringArray, x => stringBuilder.AppendLine(x));
等风来 2024-08-18 05:28:17

如果您使用 .NET core,那么这将起作用:

stringBuilder.AppendJoin(Environment.NewLine, stringArray);

虽然它没有利用 LINQ,但它确实可以在一行中完成它,而无需添加任何额外的代码。

If you're using .NET core then this will work:

stringBuilder.AppendJoin(Environment.NewLine, stringArray);

Although it's not leveraging LINQ, but it does get it done in one line without adding any extra code.

风追烟花雨 2024-08-18 05:28:17
stringArray.DoForAll(x => StringBuilder.AppendLine(x));

其中,DoForAll 是一个扩展方法:

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);   
    }
} 
stringArray.DoForAll(x => StringBuilder.AppendLine(x));

Where, DoForAll is an extension method:

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);   
    }
} 
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文