用于IEnumerable <T>的String.Join(string,string [])的模拟

aba*_*hev 7 c# linq ienumerable extension-methods

class String包含非常有用的方法 - String.Join(string, string[]).

它从数组创建一个字符串,用给定的符号分隔数组的每个元素.但一般 - 它不会在最后一个元素后添加分隔符!我将它用于ASP.NET编码,用<br />"或"分隔Environment.NewLine.

所以我想在每行之后添加一个空行asp:Table.我IEnumerable<TableRow>可以使用哪种方法来实现相同的功能?

spe*_*der 8

我写了一个扩展方法:

    public static IEnumerable<T> 
        Join<T>(this IEnumerable<T> src, Func<T> separatorFactory)
    {
        var srcArr = src.ToArray();
        for (int i = 0; i < srcArr.Length; i++)
        {
            yield return srcArr[i];
            if(i<srcArr.Length-1)
            {
                yield return separatorFactory();
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

您可以按如下方式使用它:

tableRowList.Join(()=>new TableRow())
Run Code Online (Sandbox Code Playgroud)

  • 除非我严重误解了这个问题,否则上述代码毫无意义.它返回最后一项*的**的分隔符?什么? (2认同)

Sco*_*ein 8

LINQ的当量String.JoinAggregate

例如:

IEnumerable<string> strings;
string joinedString = strings.Aggregate((total,next) => total + ", " + next);
Run Code Online (Sandbox Code Playgroud)

如果给出TableRows的IE,则代码将类似.

  • 警告:这可能与`String.Join`功能相同,但实现方式不同.`String.Join`非常聪明,可以使用`StringBuilder`来避免分配一大堆瞬态`String`实例,而上面的代码却没有. (4认同)

Ian*_*cer 7

在.NET 3.5中,您可以使用此扩展方法:

public static string Join<TItem>(this IEnumerable<TItem> enumerable, string separator)
{
   return string.Join(separator, enumerable.Select(x => x.ToString()).ToArray());
}
Run Code Online (Sandbox Code Playgroud)

或者在.NET 4中

public static string Join<TItem>(this IEnumerable<TItem> enumerable, string separator)
{
   return string.Join(separator, enumerable);
}
Run Code Online (Sandbox Code Playgroud)

但问题是在每个元素之后需要一个分隔符,包括这个(3.5版本)可用的最后一个元素: -

public static string AddDelimiterAfter<TItem>(this IEnumerable<TItem> enumerable, string delimiter)
{
   return string.Join("", enumerable.Select(x => x.ToString() + separator).ToArray());
}
Run Code Online (Sandbox Code Playgroud)

您也可以使用.Aggregate在没有扩展方法的情况下执行此操作.