【问题标题】:How to create a string set with multiple list?如何创建具有多个列表的字符串集?
【发布时间】:2018-07-06 09:23:03
【问题描述】:

用户可以传递任意数量的列表,其中包含相同数量的元素。示例 - 用户已通过低于 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))" 

【问题讨论】:

  • "需要一个 c# 代码。"你当然需要。你是怎么做到的?你被困在哪里了?我们不是为你做你的工作。
  • 是的,我试过了,想了解当列表数量是动态的时如何进行迭代。请在下面查看我的评论。如果已经讨论了解决此问题的方法,您也可以将我重定向到任何站点。谢谢
  • 如何声明hospitalId、patientId和statusId?
  • 用户正在发送参数列表,在不同的时间可能会有所不同。格式为 Key value Dictionary> 例如[ HospitalId, (H11, H12, H13) ]

标签: c# list generics dynamic


【解决方案1】:

您应该遍历您的列表并以索引方式附加它们以准备结果。

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();

【讨论】:

  • 恕我直言,纯代码答案是一种气味。特别是当问题中没有给出任何负担时。
  • 感谢您的回复,我知道上述方法,如果您知道列表的数量,肯定会起作用,但在我的情况下,用户可以传递任意数量的列表,例如(医院、患者和状态) id 下一个请求可能会附带一个更多列表,例如operation_Id 列表的元素直到 n。
【解决方案2】:

如果您有 n 数量相同长度的 List&lt;T&gt; 项目,基本循环就可以解决问题。这是一个作为扩展方法的版本,它将接受任意数量的列表作为输入:

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)})"))})";

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-16
    • 2016-07-09
    • 2017-04-17
    • 1970-01-01
    相关资源
    最近更新 更多