当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在.NET中有效地合并字符串数组,保持不同的值》经验,为你挑选了2个好方法。

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

string[] list1 = new string[] { "apple", "orange", "banana" };
string[] list2 = new string[] { "banana", "pear", "grape" };

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

{ "apple", "orange", "banana", "pear", "grape" }

我可以用LINQ做到这一点:

string[] result = list1.Concat(list2).Distinct().ToArray();

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

有没有更好的办法?



1> Wonko..:
string[] result = list1.Union(list2).ToArray();

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


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

2> Jon Skeet..:

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

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

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

效果相当于:

public static IEnumerable DistinctConcat(IEnumerable first, IEnumerable second)
{
    HashSet returned = new HashSet();
    foreach (T element in first)
    {
        if (returned.Add(element))
        {
            yield return element;
        }
    }
    foreach (T element in second)
    {
        if (returned.Add(element))
        {
            yield return element;
        }
    }
}

推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有