Преобразование многомерной коллекции в строку с разделителем - PullRequest
2 голосов
/ 04 августа 2020

Когда я работал над этим ответом , я написал код для преобразования общей c многомерной коллекции в строку.

public static string ConvertToString<T>(this IEnumerable<IEnumerable<T>> input, string columnSplit = "", string rowSplit = "\n")
{
    return string.Join(rowSplit, input.Select(r => string.Concat(string.Join(columnSplit, r.Select(c => c.ToString())))));
}

Пример ввода

IEnumerable<IEnumerable<string>> input = new List<List<string>>
{
    new List<string> { "R", "L", "R", "R" },
    new List<string> { "L", "R", "V", "R" },
    new List<string> { "L", "R", "V", "R" },
    new List<string> { "R", "L", "L", "R" },
};

Желаемый результат

RLRR
LRVR
LRVR
RLLR

Хотя код работает, я не считаю решение элегантным с тем фактом, что для этого требуется string.Join внутри string.Concat внутри Select. Есть ли способ упростить это решение.

Ответы [ 3 ]

2 голосов
/ 04 августа 2020

это будет работать без concat и select ....

public static string ConvertToString<T>(this IEnumerable<IEnumerable<T>> input, string columnSplit = "", string rowSplit = "\n")
{
  return string.Join(rowSplit, input.Select(r => string.Join(columnSplit, r)));
}

работает с:

 IEnumerable<IEnumerable<string>> input = new List<List<string>>
            {
                new List<string> { "R", "L", "R", "R" },
                new List<string> { "L", "R", "V", "R" },
                new List<string> { "L", "R", "V", "R" },
                new List<string> { "R", "L", "L", "R" },
            };

и:

 IEnumerable<IEnumerable<int>> nums = new List<List<int>>
            {
                new List<int> { 1,2,3,4},
                new List<int> { 5,6,7,8},
            };
1 голос
/ 04 августа 2020

Поскольку вы все равно определяете расширения, почему бы не полностью go?

public static string ConvertToString<T>(this IEnumerable<IEnumerable<T>> input, string columnSplit = "", string rowSplit = "\n") =>
    input.Select(r => r.ConvertToString(columnSplit)).ConvertToString(rowSplit);
    
public static string ConvertToString<T>(this IEnumerable<T> input, string split = "") => 
    string.Join(split, input.Select(i => i.ToString()));
0 голосов
/ 04 августа 2020

Вот несколько мерзких методов, которые я использовал

public static string ToStringEnumeration(this IEnumerable source)
{
    return ToStringEnumeration(source, EnumerationMode.NewLineEach, null);
}

public enum EnumerationMode
{
    NewLineEach,
    Separator,
}

public static string ToStringEnumeration(this IEnumerable source, EnumerationMode mode, string separator = null)
{
    return ToStringEnumeration(source, mode, separator, null, null);
}

public static string ToStringEnumeration(this IEnumerable source, EnumerationMode mode, string separator, IFormatProvider provider, string format)
{
    if (source is null)
        throw new ArgumentNullException(nameof(source));

    if (source.IsEmpty())
        return "";

    var sBuilder = new StringBuilder();
    foreach (var element in source)
    {
        var strElement = format is null ? element.ToString() : string.Format(provider, format, element);
        sBuilder.Append(strElement);

        if (mode == EnumerationMode.NewLineEach)
            sBuilder.AppendLine();
        else if (mode == EnumerationMode.Separator)
            sBuilder.Append(separator);
    }

    var sLength = separator?.Length ?? 1;

    if (mode == EnumerationMode.NewLineEach) //quit /n/r
        sBuilder.Remove(sBuilder.Length - 2, 2);
    else if (mode == EnumerationMode.Separator)
        sBuilder.Remove(sBuilder.Length - sLength, sLength);

    return sBuilder.ToString();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...