2015-05-08 1 views
-1

Таким образом, у меня есть 2 массивов, как это:Объединения дубликатов в массивах в C#

array1 = {1,2,3,4}; 
array2 = {353, 588, 213, 353}; 

Число в array1 соответствуют соответствующим индексам в массив2, так что из этого означает: 1 353, 2 588, 3 из 213, 4 из 353. Я хочу, чтобы иметь возможность объединить дубликаты в массив 2, так что окончательный один становится:

array1 = {5,2,3}; 
array2 = {353,588,213}; 

Я думал о циклически, но я думаю, что это неэффективно, так что я надеялся, кто-то знал бы самый эффективный способ сделать это.

Заранее благодарен!

Вот еще один пример

array1 = {14,2,3,8,10,2,7,9}; 
array2 = {353, 588, 353, 213, 588, 213, 200, 353}; 

array1 = {26,12,10,7}; 
array2 = {353,588,213,200}; 
+1

так что вы хотите объединить последний к предыдущему встречаемости , а также добавить индексы (индексы?) в массиве один к первому вступлению? – Marco

+1

Почему первое число в преобразованной матрице1 равно 5? –

+0

@ General-Doomer кажется суммой индексов из первого массива – Banana

ответ

8

Вы можете использовать diccionary где ключ ценность array2 и значение словаря является граф:

var dic = new Dictionary<int, int>(); 
for(int i = 0; i < array2.Length; i++) { 
    int index = array2[i]; 
    if(dic.ContainsKey(index)) { 
     dic[index] += array1[i]; 
    } else { 
     dic.Add(index, array1[i]); 
    } 
} 

Затем, чтобы преобразовать словарь снова массивы вам нужно только итерацию над ней:

array1 = new int[dic.Count]; 
array2 = new int[dic.Count]; 

int position = 0; 

foreach (var kvp in dic) 
{ 
    array1[position] = kvp.Value; 
    array2[position] = kvp.Key; 
    position++; 
} 

Demo

+1

Спасибо, как бы преобразовать этот словарь обратно в 2 массива? – User13888

+0

Ответ обновлен с конверсией и демонстрационной версией –

+0

Большое вам спасибо! :) – User13888

4

demo

using System; 
using System.Linq; 
using System.Collections.Generic; 

public class Program 
{ 
    public static void Main() 
    { 
     var array1 = new int[]{1,2,3,4}; 
     var array2 = new int[]{353, 588, 213, 353}; 

     var result = array1.Zip(array2, (a1, a2)=>new {Index = a1, Value = a2}) 
          .GroupBy(pair=>pair.Value).ToList(); 

     array2 = result.Select(gr=>gr.Key).ToArray(); 
     array1 = result.Select(gr=>gr.Sum(pair=>pair.Index)).ToArray(); 

     Console.WriteLine(String.Join(", ", array1));  
     Console.WriteLine(String.Join(", ", array2)); 
    } 
} 
2

Вы можете использовать LINQ, чтобы получить в результате слияния. Это легко сделать с помощью метода Enumerable.Zip, который создает последовательность результатов из соответствующих элементов в двух последовательностях (array1 и array2 в вашем случае). Он будет производить вас пар из elemens:

{ a1 = 1, a2 = 353 } 
{ a1 = 2, a2 = 213 } 
{ a1 = 3, a2 = 588 } 
{ a1 = 4, a2 = 353 } 

Следующий шаг группируется с Enumerable.GroupBy а2. Он будет производить вам группу пара

{ Key = 353, [{ a1 = 1, a2 = 353 }, { a1 = 4, a2 = 353 }] } 
{ Key = 213, [{ a1 = 2, a2 = 213 }] } 
{ Key = 588, [{ a1 = 3, a2 = 588 }] } 

Затем просто выберите то, что вам нужно от каждой группы и поместить результаты в соответствующие массивы:

var groups = array1.Zip(array2, (a1,a2) => new { a1, a2 }) 
        .GroupBy(x => x.a2) 
        .ToArray(); 

array1 = groups.Select(g => g.Sum(x => x.a1)).ToArray(); 
array2 = groups.Select(g => g.Key).ToArray(); 
1
int[] array1 = new int[] { 14, 2, 3, 8, 10, 2, 7, 9 }; 
int[] array2 = new int[] { 353, 588, 353, 213, 588, 213, 200, 353 }; 

// merge 
Dictionary<int, int> dic = new Dictionary<int, int>(); 
int count = array1.Length; 
int sum; 
for (int i = 0; i < count; i++) 
{ 
    int a = array1[i]; 
    int b = array2[i]; 
    dic[b] = a + (dic.TryGetValue(b, out sum) ? sum : 0); 
} 

int[] convertedArray1 = dic.Values.ToArray(); 
int[] convertedArray2 = dic.Keys.ToArray(); 

// result is: 
// convertedArray1 = { 26, 12, 10, 7 } 
// convertedArray2 = { 353, 588, 213, 200 }