Добавление массивов без копирования повторяющихся значений в 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

Примечание. Я предпочитаю функцию, которая работает с диапазонами дат.


person Aivan Monceller    schedule 25.01.2011    source источник
comment
аналогичная проблема здесь: stackoverflow.com/questions/3325810/   -  person Ben Voigt    schedule 26.01.2011


Ответы (1)


.Union даст вам четкое сочетание различных последовательностей. Примечание: если вы работаете с пользовательским типом, вам нужно будет предоставить переопределения для GetHashCode/Equals внутри класса или предоставить IEqualityComparer<T> для вашего типа в перегрузке. Для типов BCL, таких как int или DateTime, все будет в порядке.

Пример:

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

Изменить

Каким был бы элегантный способ объединить все мои диапазоны, не связывая их все в одну команду.

Если у вас есть последовательность последовательностей, будь то набор списков, возможно, зубчатый массив, вы можете использовать метод SelectMany вместе с Distinct.

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]);
person Anthony Pegram    schedule 25.01.2011
comment
Каким был бы элегантный способ объединить все мои диапазоны, не связывая их все в одну команду. - person Aivan Monceller; 26.01.2011
comment
наконец, как насчет List‹int32[]› ? - person Aivan Monceller; 26.01.2011
comment
@geocine, метод SelectMany все еще применяется. int[] является реализатором IEnumerable<T>, List<> также является реализатором. Тот же код LINQ, который работает для int[][], работает для указанной выше коллекции и будет работать для IEnumerable<IEnumerable<int>>. - person Anthony Pegram; 26.01.2011