在.NET中有效地合并字符串数组,保持不同的值

Jas*_*son 39 c# linq arrays merge distinct

我正在使用.NET 3.5.我有两个字符串数组,可以共享一个或多个值:

string[] list1 = new string[] { "apple", "orange", "banana" };
string[] list2 = new string[] { "banana", "pear", "grape" };
Run Code Online (Sandbox Code Playgroud)

我想要一种方法将它们合并到一个没有重复值的数组中:

{ "apple", "orange", "banana", "pear", "grape" }
Run Code Online (Sandbox Code Playgroud)

我可以用LINQ做到这一点:

string[] result = list1.Concat(list2).Distinct().ToArray();
Run Code Online (Sandbox Code Playgroud)

但我想这对大型阵列来说效率不高.

有没有更好的办法?

Won*_*nko 95

string[] result = list1.Union(list2).ToArray();
Run Code Online (Sandbox Code Playgroud)

来自msdn:"此方法从返回集中排除重复.这是Concat(TSource)方法的不同行为,它返回输入序列中的所有元素,包括重复项."

  • 一个小问题,但Union的返回类型是IEnumerable <T>,所以你需要添加一个ToArray()来获取字符串[] (5认同)
  • 我回到这个主题来准确发布这个解决方案.我相信它在任何方面都是理想的! (2认同)

Jon*_*eet 12

为什么你会想到效率低下?据我所知,Concat和Distinct都被懒惰地评估,在幕后使用HashSet为Distinct跟踪已经返回的元素.

我不确定你是如何设法让它比一般方式更高效:)

编辑:Distinct实际上使用Set(内部类)而不是HashSet,但要点仍然是正确的.这是LINQ多么简洁的一个很好的例子.最简单的答案与没有更多领域知识的情况一样有效.

效果相当于:

public static IEnumerable<T> DistinctConcat<T>(IEnumerable<T> first, IEnumerable<T> second)
{
    HashSet<T> returned = new HashSet<T>();
    foreach (T element in first)
    {
        if (returned.Add(element))
        {
            yield return element;
        }
    }
    foreach (T element in second)
    {
        if (returned.Add(element))
        {
            yield return element;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)