2013-02-13 97 views
0

我有3个阵列。高级删除阵列重复

Array 1 = {1,1,1,1,2,2,3,3} 
Array 2 = {a,a,a,a,e,e,b,b} 
Array 3 = {z,z,z,z,z,z,z,z} 

我想从阵列1中删除所有重复和还除去同一元件在所述在其他阵列重复,以保持它们的所有正确链接。我知道你可以使用.Distinct()。ToArray()为一个数组做这个,但其他数组也不会删除这些元素。

结果看起来像这样。

Array 1 = {1,2,3} 
Array 2 = {a,e,b} 
Array 3 = {z,z,z} 

我猜想解决这个问题的唯一方法是以下几点。

For(int a = 0; a < Array1.count; a++) { 
    For(int b = a + 1; b < Array1.count; b++) { 
     if(Array1[a]==Array1[b]) { 
     Array1.RemoveAt(b); 
     Array2.RemoveAt(b); 
     Array3.RemoveAt(b); 
     } 
    } 
} 

但是很高兴找到一个简单的预定义函数!

+5

你确定应该*真的*有三个数组,而不是一个数组,其中每个元素都由三个不同的值组成?当你有多个需要保持锁定步骤的集合时,我总是感到紧张... – 2013-02-13 18:13:58

+0

你不能为另外两个数组做'.Distinct().Tarray()'吗? – Brian 2013-02-13 18:14:03

+0

如何发布一些实际的代码,你的问题是其他地方,Distinct()应该工作 – 2013-02-13 18:15:22

回答

1
var distinctIndexes = array1 
    .Select((item, idx) => new { Item = item, Index = idx }) 
    .GroupBy(p => p.Item) 
    .Select(grp => grp.First().Index); 

var result1 = distinctIndexes.Select(i => array1[i]).ToArray(); 
var result2 = distinctIndexes.Select(i => array2[i]).ToArray(); 
var result3 = distinctIndexes.Select(i => array3[i]).ToArray(); 

注意这不一定会使用第一个数组中的第一个唯一元素。如果您需要这样做,您可以计算索引

var distinctIndexes = array1 
    .Select((item, idx) => new { Item = item, Index = idx }) 
    .Aggregate(new Dictionary<int, int>(), (dict, i) => 
    { 
     if (! dict.ContainsKey(i.Item)) 
     { 
      dict[i.Item] = i.Index; 
     } 
     return dict; 
    }) 
    .Values; 
0

您应该仔细考虑使用的数据结构。这种“删除”操作是否可能一次发生?多久? (我不是在挑战你对Array的使用,只是一般性的提示,但是你的场景看起来很奇怪)。此外,您没有解释这是基于索引的删除还是基于元素的删除。如果我正在实现这个,我会试图创建一个新的Array,并将所有剩余的元素添加到循环中的新Array中,而忽略要删除的元素。然后只需用'='重新分配参考。当然,这取决于数组的最大预期大小,因为我建议的副本会占用更多内存(通常不会成为问题)。

0

我真的不知道干净的方式来做你所问的,但这是做你所问的一个通用的例子吗?

static void RemoveDupes(ref Array a1, ref Array a2, ref Array a3) 
{ 
    Type a1t, a2t, a3t; 
    int newLength, ni, oi; 
    int[] indices; 

    a1t = a1.GetType().GetElementType(); 
    a2t = a1.GetType().GetElementType(); 
    a3t = a1.GetType().GetElementType(); 


    Dictionary<object, List<int>> buckets = new Dictionary<object, List<int>>(); 
    for (int i = 0; i < a1.Length; i++) 
    { 
     object val = a1.GetValue(i); 
     if (buckets.ContainsKey(val)) 
      buckets[val].Add(i); 
     else 
      buckets.Add(val, new List<int> { i }); 
    } 

    indices = buckets.Where(kvp => kvp.Value.Count > 1).SelectMany(kvp => kvp.Value.Skip(1)).OrderBy(i => i).ToArray(); 
    newLength = a1.Length - indices.Length; 

    Array na1 = Array.CreateInstance(a1t, newLength); 
    Array na2 = Array.CreateInstance(a2t, newLength); 
    Array na3 = Array.CreateInstance(a3t, newLength); 

    oi = 0; 
    ni = 0; 
    for (int i = 0; i < indices.Length; i++) 
    { 
     while (oi < indices[i]) 
     { 
      na1.SetValue(a1.GetValue(oi), ni); 
      na2.SetValue(a2.GetValue(oi), ni); 
      na3.SetValue(a3.GetValue(oi), ni); 
      oi++; 
      ni++; 
     } 
     oi++; 
    } 
    while (ni < newLength) 
    { 
     na1.SetValue(a1.GetValue(oi), ni); 
     na2.SetValue(a2.GetValue(oi), ni); 
     na3.SetValue(a3.GetValue(oi), ni); 
     oi++; 
     ni++; 
    } 
    a1 = na1; 
    a2 = na2; 
    a3 = na3; 
}