【问题标题】:Concatenate all list content in one string in C#在 C# 中将所有列表内容连接到一个字符串中
【发布时间】:2010-05-22 00:51:57
【问题描述】:

如何在 C# 中将列表的所有内容连接到一个字符串中?

【问题讨论】:

标签: c# list


【解决方案1】:

正在搜索这个:

List<string> list = new List<string>(); // { "This ", "is ", "your ", "string!"};
list.Add("This ");
list.Add("is ");
list.Add("your ");
list.Add("string!");

string concat = String.Join(" ", list.ToArray());

【讨论】:

  • 如何用空格分隔它们?
  • string.Join(" ", list.ToArray());
  • 不确定是否需要 ToArray() 部分(.NET 4):String.Join() 似乎对 List 和 List 有重载。
  • @EdGraham 实际上,重载是针对 IEnumerable 而有一个特定的针对 IEnumerable
  • “字符串!”后缺少一个空格
【解决方案2】:

您可以使用 Aggregate 函数连接列表的所有项目。

以下是用逗号“,”连接列表的所有项目的示例

string s = list.Aggregate((i, j) => i + "," + j).ToString();

【讨论】:

  • 注意:当列表的元素为零时会产生异常。
【解决方案3】:

如果您需要在加入时转换列表元素,可以使用LINQ

string.Join(", ", mylist.Select(z => MyMethod(z)));

例子:

IEnumerable<string> mylist = new List<string>() {"my", "cool", "list"};
string joined = string.Join(", ", mylist.Select(z => MyMethod(z)));


public string MyMethod(string arg)
{
    return arg.ToUpper();
}

【讨论】:

  • 为什么是-1?有什么原因吗?
【解决方案4】:

如果您的对象中有一些属性并且想要在其中进行更多格式化,那么使用 LINQ,

var output = string.Join(" ", list.Select(t => t.Prop1 + " " + t.Prop2));

这将在对象的每个属性之间放置一个空格,并在每个对象之间放置一个空格。

【讨论】:

    【解决方案5】:

    这是一个使用 StringBuilder 的简单解决方案:

            var sb = new StringBuilder();
            strings.ForEach(s => sb.Append(s));
            var combinedList = sb.ToString();
    

    【讨论】:

      【解决方案6】:

      类似这样的:

          List<String> myStrings = new List<string>() { "string1", "string2", "string3" };
          StringBuilder concatenatedString = new StringBuilder();
          foreach (String myString in myStrings)
          {
              concatenatedString.Append(myString);
          }
          Console.WriteLine(concatenatedString.ToString());
      

      【讨论】:

        【解决方案7】:

        这是一个使用 LINQ 实现的使用两个空格分隔元素的版本:

        var s = list.Aggregate(new StringBuilder(), (sb, current) => 
          sb.AppendFormat("{0}  ", current)).ToString();
        

        Aggregate 方法将StringBuilder(作为sb)与列表的当前元素(作为current)传递给可以做任何它需要的任何事情的lambda表达式 - 例如附加当前字符串使用 lambda 表达式主体中指定的某些格式将列表添加到 StringBuilder

        【讨论】:

        • 无需重新发明轮子。 string.Join 做到了。
        • @Matt:你说得对——它允许你指定一个分隔符(我忘了),但在某些情况下,你可能仍然需要更强大的解决方案。
        • 是的,没错。而且 LINQ 暴露得越多越好。
        【解决方案8】:
        public static string ToString<T>(this IEnumerable<T> source, string delimiter)
        {
            string d = String.Empty;
            var result = new StringBuilder();
            foreach(T item in source)
            {
                result.Append(d).Append(item.ToString());
                d = delimiter;
            }
            return result.ToString();
        }
        

        还有一个用于对单个值进行更好的可选字符串转换的重载:

        public static string ToString<T>(this IEnumerable<T> source, string delimiter, Func<T, string> toString)
        {
            string d = String.Empty;
            var result = new StringBuilder();
            foreach(T item in source)
            {
                result.Append(d).Append(toString(item));
                d = delimiter;
            }
            return result.ToString();
        }
        

        【讨论】:

          【解决方案9】:

          试试这个:

          request.AllFacilityId = request.FacilityIdList.Aggregate((i, j) => i + "," + j);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-01-17
            • 2021-12-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-10-05
            相关资源
            最近更新 更多