将列表<string[]>压平为单个字符串,每个元素占一行

问题描述 投票:0回答:3

我有一个

List<string[]>
类型的实例,我想将其转换为一个字符串,其中每个
string[]
位于换行符上。我正在使用以下 LINQ 查询来展平列表,但是我不确定如何在每个
string[]
之间添加新行,而不会将查询扩展为更难看的内容。有没有一种方法可以在不破坏我的查询并在
String.Join
循环内使用
IEnumerable.Aggregate
foreach
的情况下完成此操作?

results.SelectMany(x => x).Aggregate((c, n) => c + ", " + n)
c# .net string linq
3个回答
60
投票
String.Join(Environment.NewLine, results.Select(a => String.Join(", ", a)));

完整样本:

var results = new List<string[]> {
    new[]{"this", "should", "be", "on"},
    new[]{"other", "line"}
};

var result = String.Join(Environment.NewLine, 
                         results.Select(a => String.Join(", ", a)));

结果:

this, should, be, on
other, line

更新 这是正确完成的聚合 - 它使用 StringBuilder 在内存中构建单个字符串

results.Aggregate(new StringBuilder(),
                  (sb, a) => sb.AppendLine(String.Join(",", a)),
                  sb => sb.ToString());

3
投票
results.Select(sa => sa.Aggregate((a, b) => a + ", " + b))
       .Aggregate((c, d) => c + Enviroment.NewLine + d);

0
投票

我还喜欢使用扩展方法来扁平化字符串集合,并且还可以指定行分隔符。请注意此处使用 Trim,否则我们将在最后有一个尾随分隔符。

using System.Text;

namespace MultiLingual.Translator.Lib
{
    public static class StringExtensions
    {

        /// <summary>
        /// Merges a collection of lines into a flattened string separating each line by a specified line separator.
        /// Newline is deafult
        /// </summary>
        /// <param name="inputLines"></param>
        /// <param name="lineSeparator"></param>
        /// <returns></returns>
        public static string? FlattenString(this IEnumerable<string>? inputLines, string lineSeparator = "\n")
        {
            if (inputLines == null || !inputLines.Any())
            {
                return null;
            }
            var flattenedString = inputLines?.Aggregate(new StringBuilder(),
                (sb, l) => sb.AppendLine(l + lineSeparator),
                sb => sb.ToString().Trim());

            return flattenedString;
        }

    }
}

在我的 XUnit 测试中的用法:

        [Theory]
        [InlineData("Jeg er fra Norge og jeg liker brunost", "i'm from norway and i like brown cheese")]
        public async Task TranslationReturnsExpected(string input, string expectedTranslation)
        {
            string? translation = await _translateUtil.Translate(LanguageCode.English, input, LanguageCode.Norwegian);
            translation.Should().NotBeNull();
            translation.Should().BeEquivalentTo(expectedTranslation);
        }
© www.soinside.com 2019 - 2024. All rights reserved.