Как создать набор строк с несколькими списками? - PullRequest
0 голосов
/ 06 июля 2018

Пользователь может передать любое количество списка с таким же количеством элементов в нем. Пример - пользователь прошел список ниже 3 (может быть динамическим с таким же количеством элементов) -

hospitalId - H11, H12, H13...n
patientId - P11, P12, P13...n
statusId - S11, S13, S11...n

Каков эффективный способ создать из него набор и сохранить его в виде строки в формате ниже? Для этого нужен код c #.

ожидаемый результат -

"((H11,P11, S11), (H12, P12, S13), (H13, P13, S11))" 

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

Если у вас есть n количество List<T> предметов одинаковой длины, базовый цикл сделает свое дело.Вот версия в качестве метода расширения, который будет принимать любое количество списков в качестве входных данных:

public static IEnumerable<IEnumerable<T>> ZipMultiple<T>(this List<List<T>> source)
{
    var counts = source.Select(s => s.Count).Distinct();
    if (counts.Count() != 1)
    {
        throw new ArgumentException("Lists aren't the same length");
    }

    for (var i = 0; i < counts.First(); i++)
    {
        var item = new List<T>();
        for (var j = 0; j < source.Count; j++)
        {
            item.Add(source[j][i]);
        }
        yield return item;
    }
}

После этого довольно просто преобразовать результат в строку в другом цикле, или вы можете сделать это какодин вкладыш:

var zipped = lists.ZipMultiple();

var output = $"({string.Join(", ", zipped.Select(x => $"({string.Join(",", x)})"))})";
0 голосов
/ 06 июля 2018

Вы должны перебрать свой список и добавить их по индексу, чтобы подготовить результат.

StringBuilder builder = new StringBuilder();
builder.Append("(");
for(var index = 0; index < n; index++) 
{
  builder.AppendFormat("({0}, {1}, {2})", hospitalId[index], patientId[index], statusId[index]);
}
builder.Append(")");

var result = builder.ToString();
...