【问题标题】:Concatenating a list of strings into a single string将字符串列表连接成单个字符串
【发布时间】:2014-04-19 06:10:28
【问题描述】:

我正在尝试将一个字符串列表连接成一个用逗号分隔的字符串。使用string.Join 非常简单,我面临的问题是如何使用属性来做到这一点?

public class JsonObject
{
    public string EntityID { get; set; }
    public string Address1 { get; set; }
    public string Address2 { get; set; }
    public string Address3 { get; set; }
    public string Address3 { get; set; }

    public List<string> Category = ??
}

我正在尝试获取一个 json 对象并将其插入数据库。 Category 是一个数组,我可以用List&lt;string&gt; 处理它。如何将此字符串列表连接成单个字符串,然后将其返回到字符串类别?我假设你必须使用一个单独的类来处理它,但除此之外我不知道该怎么做。

Json 对象如下所示:

"EntityID":"foo",
"Categories": [ "Category1", "Category2", "Category3"] 

我想将这些类别(1,2,3)连接成单个字符串,即

public string Category;

【问题讨论】:

    标签: c# json string concatenation


    【解决方案1】:
    public static string Concat(this IEnumerable<string> yourString) {
        StringBuilder category= new StringBuilder();
        foreach(string s in yourString) {
            category.Append(s);
        }
        return category.ToString();
    }
    

    如果您使用的是 .net 4.0

      String.Join(String.Empty, yourString.ToArray());
    

    【讨论】:

    • String.Join 自 .NET 1.1 以来一直存在。
    • 我认为 OP 的意思是“如果你使用 .NET 4.+”
    • @abatishchev - 我不知道为什么这有什么不同。乍一看,它是一种扩展方法。这些至少在 3.5 中可用,如果不是 3.0(不记得确切)。
    • @Tim: String.Join prior 4.0 只接受T[],而不是IEnumerable&lt;T&gt;
    • @abatishchev - 啊,明白了。显然,过了我的就寝时间。感谢您的澄清:)
    【解决方案2】:

    首先,我建议不要列出包含非常相似信息的变量,而应该将它们分组到一个容器中。

    public string[] Addresses { get; protected set; }
    

    确保在构造函数中将数组初始化为您想要的大小。另外,如果这真的应该是动态大小的,请考虑 List。

    如果您想要一个特殊的助手来加入您的字符串,只需将问题抽象掉即可。基本上,您想要遍历一组字符串。

    protected IEnumerable<string> GetStringData()
    {
      yield return EntityID;
      foreach (var address in Addresses)
        yield return address;
    }
    

    然后使用string.Join将字符串连接在一起

    string commaDelim = string.Join(",", GetStringData())
    

    编辑如果您想使用问题中所述的Category 属性:

    public string Category { get { return string.Join(",", GetStringData()); } }
    

    【讨论】:

    • 不幸的是,我无法控制 JSON,所以我必须使用我得到的东西。我已经更新了这个问题,让它更清楚一点。
    • 那就看看@abatishchev 的回答
    【解决方案3】:

    如果你需要一个分隔符分隔的字符串,那么:

    public List<string> Categories { get; set; }
    
    public string Category
    {
        get
        {
            return String.Join(",", Categories);
        }
    }
    

    如果只是连接,即通过空字符串连接:

    public string Category
    {
        get
        {
            return String.Concat(Categories);
        }
    }
    

    【讨论】:

    • 我已经编辑了我的问题,以便更清楚地了解我的要求。地址的当前格式没有问题。
    • @payo:对不起,你什么意思?没有收到您的评论。
    • @Corey:你想把一个类别列表“扁平化”成一个字符串吗?
    • 你已经编辑了你的答案,现在我的回应是一个僵尸指针......但我是说 string.Join 重载包括 string.Join(string, params object[]) (至少从.net 4.0)
    • @Corey:这不会立即发生。当实体是对象时,C# 属性仅在 C# 中有效。见stackoverflow.com/questions/15585330/… 和类似的
    【解决方案4】:

    我希望我能正确理解您的问题,因为您想知道如何通过类属性进行连接。

    如果是这样,那么这是我建议的解决方案:

    public class JsonObject
        {
            public string CompiledString { get; set; }
    
            private string _Category;
            public string Category 
            { 
                get
                { 
                    return _Category; 
                }
                set
                {
                    _Category = value;
                    CompileString();
                }
            }
    
            private string _EntityID;
            public string EntityID
            {
                get
                {
                    return _EntityID;
                }
                set
                {
                    _EntityID = value;
                    CompileString();
                }
            }
            //Rest of the properties go here
    
            private void CompileString()
            {
                //cycle through each of your properties and update the CompiledString variable
                CompiledString =
                    _Category == null ? string.Empty : _Category + "," +
                    _EntityID == null ? string.Empty : _EntityID + ",";
                //I left the last comma in there because you will be adding other props... just remember to exclude it from the last one.
    
                //Of course this part of the implementation is entirely up to you, your question was about how to do it through the property
            }
        }
    

    您的类中有一个公共字段或属性,其中包含连接的值,然后在您的属性设置器中,您调用类中的私有方法来为您进行连接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-02
      • 1970-01-01
      • 2017-05-14
      • 1970-01-01
      • 2023-01-13
      • 2013-05-15
      相关资源
      最近更新 更多