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() を使用して 1 つの配列に対してこれを実行できることはわかっていますが、他の配列でも要素が削除されません。

結果は次のようになります。

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);
      }
    }
}

ただし、単純な定義済み関数を見つけるとよいでしょう。

4

3 に答える 3

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;
于 2013-02-13T18:17:13.940 に答える
0

使用しているデータ構造を慎重に検討する必要があります。この「削除」操作は一度に行われる可能性がありますか? どのくらいの頻度で?(必ずしも配列の使用に異議を唱えているわけではありません。一般的なヒントにすぎませんが、シナリオは奇妙に思えます)。また、これがインデックスベースの削除なのか要素ベースの削除なのかについても説明していません。これを実装する場合、新しい配列を作成し、残りのすべての要素を新しい配列にループで追加して、削除する要素を無視したくなるでしょう。次に、参照を「=」で再割り当てします。もちろん、それは配列の最大予想サイズに依存します。これは、私が提案したようなコピーはより多くのメモリを消費するためです (通常は問題になりません)。

于 2013-02-13T18:17:41.477 に答える
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;
}
于 2013-02-13T19:17:34.927 に答える