【发布时间】:2017-01-02 00:15:17
【问题描述】:
我有一个扩展方法,可以将 IEnumerable 中的每个对象附加到 StringBuilder。但是,它使用类型参数在 IEnumerable 上运行,所以我的问题是它会触发单独类型独有的 Append() 调用,还是 everything 作为“对象”通过并且效率低下?如果需要,我将针对 StringBuilder 具有该类型特有的 Append() 调用的特殊情况扩展该函数,但我需要知道是否必须这样做。
/// <summary>
/// Appends each object in the enumerable to the StringBuilder's content.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sb"></param>
/// <param name="e"></param>
/// <returns></returns>
/// <exception cref="System.ArgumentOutOfRangeException"/>
public static StringBuilder AppendEach<T>(this StringBuilder sb, IEnumerable<T> e)
{
e.Do<T>(t => sb.Append(t));
return sb;
}
/// <summary>
/// Allows you to run code on each value in a collection in-line.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="t"></param>
/// <param name="action"></param>
public static void Do<T>(this IEnumerable<T> e, Action<T> action)
{
foreach (T t in e) action(t);
}
不确定我使用的 Do 扩展是否会改变问题的结果,因此我将其包含在内,而不是简化代码。我知道有些人会因为我在这里写“具有副作用的 LINQ 方法”而绞死我,但这与手头的问题无关。
【问题讨论】:
标签: c# generics ienumerable extension-methods stringbuilder