我正在使用.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();
但我想这对大型阵列来说效率不高.
有没有更好的办法?
string[] result = list1.Union(list2).ToArray();
来自msdn:"此方法从返回集中排除重复.这是Concat(TSource)方法的不同行为,它返回输入序列中的所有元素,包括重复项."
为什么你会想到效率低下?据我所知,Concat和Distinct都被懒惰地评估,在幕后使用HashSet为Distinct跟踪已经返回的元素.
我不确定你是如何设法让它比一般方式更高效:)
编辑:Distinct实际上使用Set(内部类)而不是HashSet,但要点仍然是正确的.这是LINQ多么简洁的一个很好的例子.最简单的答案与没有更多领域知识的情况一样有效.
效果相当于:
public static IEnumerableDistinctConcat (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; } } }