代码之家  ›  专栏  ›  技术社区  ›  Kristofer Mar Einarsson

优化IEnumerable<string>[duplicate]的迭代

  •  0
  • Kristofer Mar Einarsson  · 技术社区  · 5 年前

    很长一段时间以来,我总是以下面的方式附加字符串。

    例如,如果我想让所有员工的名字用符号隔开,在下面的例子中,我选择了管道符号。

    字符串final=string.Empty;

    foreach(Employee emp in EmployeeList)
    {
      final+=emp.Name+"|"; // if i want to separate them by pipe symbol
    }
    

    最后,我做了一个子字符串并删除了最后一个管道符号,因为它不是必需的

    final=final.Substring(0,final.length-1);
    

    我不想为最后一项设置管道符号的外观并再次执行子字符串。

    0 回复  |  直到 13 年前
        1
  •  26
  •   BrokenGlass    13 年前

    使用 string.Join() 和具有 Select()

    finalString = string.Join("|", EmployeeList.Select( x=> x.Name));
    

    此方法更好的三个原因:

    1. 它表示 打算

    2. 该框架对其进行了优化 性能:在大多数情况下 StringBuilder 内部,所以 您没有创建多个 垃圾收集。另见: Do not concatenate strings inside loops

    3. 你不必担心特殊情况 . string.Join() 自动处理以下情况: 我也不想要另一个分隔符 这简化了您的代码并使 它不太容易出错。

        2
  •  3
  •   robert vano    13 年前

    你应该 join 你的琴弦。

    示例(借用自MSDN):

    using System;
    
    class Sample {
        public static void Main() {
        String[] val = {"apple", "orange", "grape", "pear"};
        String sep   = ", ";
        String result;
    
        Console.WriteLine("sep = '{0}'", sep);
        Console.WriteLine("val[] = {{'{0}' '{1}' '{2}' '{3}'}}", val[0], val[1], val[2], val[3]);
        result = String.Join(sep, val, 1, 2);
        Console.WriteLine("String.Join(sep, val, 1, 2) = '{0}'", result);
        }
    }
    
        3
  •  2
  •   FiveTools    13 年前

    我喜欢在linq中使用聚合函数,例如:

    string[] words = { "one", "two", "three" };
    var res = words.Aggregate((current, next) => current + ", " + next);
    
        4
  •  1
  •   marklar    13 年前

    int size = EmployeeList.length()
    for(int i = 0; i < size - 1; i++)
    {
         final+=EmployeeList.getEmployee(i).Name+"|";
    }
    final+=EmployeeList.getEmployee(size-1).Name;
    
        5
  •  0
  •   FIre Panda    13 年前

    因为像这样的建筑,一个 StringBuilder 可能是更好的选择。