2011-01-25 119 views
3

什麼是做到這一點的最快方法:添加陣列,而不在C#中複製重複值

var firstArray = Enumerable.Range(1, 10).ToArray(); // 1,2,3,4,5,6,7,8,9,10 
var secondArray = Enumerable.Range(9, 3).ToArray(); //     9,10,11,12 
var thirdArray = Enumerable.Range(2, 3).ToArray(); // 2,3,4,5 
//add these arrays expected output would be   1,2,3,4,5,6,7,8,9,10,11,12 

有一個LINQ的方式來做到這一點。我有一個巨大的數組列表來迭代。另一個例子

var firstArray = Enumerable.Range(1, 10).ToArray(); // 1,2,3,4,5,6,7,8,9,10 
var secondArray = Enumerable.Range(12, 1).ToArray(); //      12,13 
//add these arrays expected output would be   1,2,3,4,5,6,7,8,9,10,12,13 

注意:我更喜歡在日期範圍內工作的函數。

+0

類似的問題在這裏:http://stackoverflow.com/questions/3325810/how-to-compare-list-of-x-to-list-of-y-in-c-by-using-泛型 – 2011-01-26 00:23:11

回答

8

.Union會給你各種序列的獨特組合。注意:如果您使用的是自定義類型,則需要在課程內提供GetHashCode/Equals的覆蓋,或者在過載中爲您的類型提供IEqualityComparer<T>。對於BCL類型,如intDateTime,您會沒事的。

例子:

var sequence = Enumerable.Range(0,10).Union(Enumerable.Range(5,10)); 
// should result in sequence of 0 through 14, no repeats 

編輯

會是什麼優雅的方式來聯合我所有的範圍,同時鏈接它們都在同一個命令。

如果你有序列的序列,無論是列表的集合,也許是交錯數組,你可以使用帶有Distinct沿SelectMany方法。

int[][] numberArrays = new int[3][]; 
numberArrays[0] = new int[] { 1, 2, 3, 4, 5 }; 
numberArrays[1] = new int[] { 3, 4, 5, 6, 7 }; 
numberArrays[2] = new int[] { 2, 4, 6, 8, 10 }; 

var allUniqueNumbers = numberArrays.SelectMany(i => i).Distinct(); 

否則,你可能會考慮創建自己的擴展方法來處理這個問題。

public static class MyExtensions 
{ 
    public static IEnumerable<T> UnionMany<T>(this IEnumerable<T> sequence, params IEnumerable<T>[] others) 
    { 
     return sequence.Union(others.SelectMany(i => i)); 
    } 
} 

// 

var allUniques = numberArrays[0].UnionMany(numberArrays[1], numberArrays[2]); 
+0

如果不將所有的範圍都鏈接到一個命令中,那麼整合所有範圍的優雅方法是什麼? – 2011-01-25 23:11:02