我有一个
List<string[]>
类型的实例,我想将其转换为一个字符串,其中每个 string[]
位于换行符上。我正在使用以下 LINQ 查询来展平列表,但是我不确定如何在每个 string[]
之间添加新行,而不会将查询扩展为更难看的内容。有没有一种方法可以在不破坏我的查询并在 String.Join
循环内使用 IEnumerable.Aggregate
或 foreach
的情况下完成此操作?
results.SelectMany(x => x).Aggregate((c, n) => c + ", " + n)
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());
results.Select(sa => sa.Aggregate((a, b) => a + ", " + b))
.Aggregate((c, d) => c + Enviroment.NewLine + d);
我还喜欢使用扩展方法来扁平化字符串集合,并且还可以指定行分隔符。请注意此处使用 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);
}