如何使用扩展方法Join()?

时间:2009-10-22 09:10:04

标签: c# extension-methods

我能理解string.Join()

  var stringies1 =new [] {"Blood", "is", "Thicker", "Than", "Water" };
  var zoin = string.Join("|", stringies1);

它与扩展方法Join()有什么不同?

I mean stringies1.Join(IEnumerable<T Result......)

3 个答案:

答案 0 :(得分:3)

我假设通过扩展方法,您指的是Enumerable.Join方法? string.Join IEnumerable.Join是两种截然不同的方法:

  • string.Join将获取一个字符串数组,使用一些分隔符将它们连接在一起,然后返回结果字符串。
  • Enumerable.Join将以与SQL中的JOIN操作相同的方式对两个集合执行操作

答案 1 :(得分:1)

您所指的扩展方法,Enumerable.Join用于加入集合,这意味着您将它们并排放置并尝试将项目与项目匹配,从而产生结果。可以想象它就像将电话簿与您的聚会名称列表相匹配,找到列表中所有名称的电话号码。

所以,不,扩展方法Join不能用于将它们放在一个数组之后,并将它们组合成一个长数组。

但是,有一种替代方法,您可以在同一个类中使用扩展方法Enumerable.Concat

此方法不对数组进行操作,而是对所有实现IEnumerable<T>的集合类型进行操作,因此也会生成另一个IEnumerable<T>作为结果。然后,您可以使用Enumerable.ToArray将结果转换为数组。

因此,您将使用以下代码:

var stringies1 = new [] {"Blood", "is", "Thicker", "Than", "Water" };
var stringies2 = new [] { "and", "so", "is", "wine" };

var stringies3 = stringies1.Concat(stringies2).ToArray();
// stringies3 now contains "Blood", "is", ... and "and", "so", "is", ...

这假设您使用的是.NET 3.5,并在文件顶部的使用列表中包含以下内容:

using System.Linq;

另一方面,如果您(或其他人发现此答案)未使用.NET 3.5,则需要一些手动代码。这是一个简单的通用方法(假设.NET 2.0),可以帮助您:

public static T[] Concat<T>(T[] firstSource, T[] secondSource,
    params T[] restOfSources)
{
    // omitted validation of non-null arguments, etc.

    Int32 totalLength = firstSource.Length + secondSource.Length;
    foreach (T[] source in restOfSources)
        totalLength += source.Length;

    T[] result = new T[totalLength];
    Int32 currentIndex = 0;

    Array.Copy(firstSource, 0, result, currentIndex, firstSource.Length);
    currentIndex += firstSource.Length;

    Array.Copy(secondSource, 0, result, currentIndex, secondSource.Length);
    currentIndex += secondSource.Length;

    foreach (T[] source in restOfSources)
    {
        Array.Copy(source, 0, result, currentIndex, source.Length);
        currentIndex += source.Length;
    }

    return result;
}

可以这样使用:

var stringies1 = ...
var stringies2 = ...

var stringies3 = YourClass.Concat(stringies1, stringies2);

答案 2 :(得分:-1)

相同功能的可读性方法不同,适当时代码较少。