【问题标题】:Convert object with two string parameters to comma separated string [duplicate]将具有两个字符串参数的对象转换为逗号分隔的字符串[重复]
【发布时间】:2018-05-29 05:07:34
【问题描述】:

这是我的对象,我正在获取该对象的列表:

public class MeetingTypeModel
{
    public string MeetingTypeId { get; set; }
    public string MeetingTypeName { get; set; }
}

List<MeetingTypeModel> MeetingTypeList

我要转成格式:

({ "1": "Bangladesh", "2": "Belgium"})

【问题讨论】:

  • 将您的列表转换为字典预序列化。
  • 只是问你们所有人,他可以通过重写 String.Join() 方法来实现这一点吗?
  • @Lucifer 覆盖String.Join() 方法是什么意思?
  • 我们可以通过使用 String.Join() 来获得一个 CSV 格式的列表 如果用户使用该逻辑并创建自己的方法来实现({ "1": "Bangladesh", "2": "Belgium"}) 。我只是问我们能不能或者我们不能? c#
  • @Lucifer 你不能覆盖string.Join,它是Type 上的静态方法。您可以创建一个不同的类型StringExtensions 和一个名为public static string Join(this string, bool myMethodSignatureIsDifferent, params string[] args) 的扩展方法,作为string.Join 或多或少的某种重载概念。但这仍然不是string 上的静态方法。而且只会让人迷惑。

标签: c#


【解决方案1】:

不应该创建 json 的方式字典

var temp = MeetingTypeList.Select(x => $"\"{x.MeetingTypeId}\" : \"{x.MeetingTypeName}\"");
var json = $"{{ {string.Join(", ", temp)} }}";

他们应该创建一个 json 字典

var dict = MeetingTypeList.ToDictionary(x => x.MeetingTypeId, x => x.MeetingTypeName); 
string json = JsonConvert.SerializeObject(dict, Formatting.Indented);

更新来自 Brett Caswells cmets

对此的一些考虑。

  • 我们不能保证与 MeetingTypeId MeetingTypeName 配对的区别(虽然不太可能)。
  • 是否在此序列化的结果中添加“(”和“)”。

如果你需要额外的括号

json = $"({json})";

【讨论】:

  • 这可能是最好的答案,尽管对此有一些考虑。首先是我们不能保证与 MeetingTypeId MeetingTypeName 配对的区别(虽然不太可能)。
  • 第二个考虑是基于是否在此序列化结果前附加了“(”和附加了“)”。我自己对 Json 中的括号并不熟悉。
  • @BrettCaswell 两个有效点
  • @BrettCaswell 更新和归属
【解决方案2】:

只需添加对 Newtonoft.Json 的引用并添加 using Newtonsoft.Json;

var MeetingTypeList = new List<MeetingTypeModel>();
// add data to list
string json = JsonConvert.SerializeObject(MeetingTypeList);

【讨论】:

  • 您还必须使用[JsonProperty("1")][JsonProperty("2")] 来装饰属性...
  • 这可能是不正确的。 OP 提出的结果输出使用 MeetingTypeId 属性的值作为字段
  • 澄清一下,这个序列化的结果不会是:[{ "MeetingTypeId" : "1", "MeetingTypeName" : "Bangladesh" }, {"MeetingTypeId" : "2", "MeetingTypeName" : "Belgium" }]
【解决方案3】:

您可以遍历列表并使用 StringBuilder,您可以生成预期的输出

public string GetString(List<MeetingTypeModel> MeetingTypeList)
{
StringBuilder sb = new StringBuilder();
sb.Append("({");
int i = 1;
foreach(MeetingTypeModel item in MeetingTypeList){

    sb.AppendFormat("\"{0}\" : \"{1}\"" , item.MeetingTypeId, item.MeetingTypeName);
    //To not append last comma
    if(i != MeetingTypeList.Count)
        sb.Append(",");
    i++;
}
sb.Append("})");
return sb.ToString();
}

POC:DotNetFiddler

【讨论】:

  • 你的代码会有一个额外的逗号
  • @SSS 我更新了我的答案,为什么要投反对票,我可以处理你的建议
  • 您的答案是正确的,不值得一票否决;但是,我不会对此表示赞同,因为我认为由于使用StringBuilder 而它的质量很低。 StringBuilder 确实有它的作用,但这里更好的答案将涉及序列化。
  • 我没有投反对票,有人投了
  • @BrettCaswell,我同意序列化将是我编写的函数的优雅方法。我使用了StringBuilder,因为它是可变的并且比string具有优势
【解决方案4】:

如果您想避免使用外部库,您可以逐项进行,如下所示:

    StringBuilder SB = new StringBuilder();
    SB.Append("({");
    for(int i=0; i<MeetingTypeList.Count; i++) {
        MeetingTypeModel mtm = MeetingTypeList[i];

        SB.AppendFormat("\"{0}\":"\"{1}\", mtm.MeetingTypeId, mtm.MeetingTypeName);
        if {i<MeetingTypeList.Count -1) {
          SB.Append(",");
        }
    }
    SB.Append("})");

【讨论】:

    猜你喜欢
    • 2016-08-19
    • 1970-01-01
    • 1970-01-01
    • 2019-11-18
    • 1970-01-01
    • 2017-10-02
    • 2015-08-22
    • 2014-08-24
    • 1970-01-01
    相关资源
    最近更新 更多