2017-09-06 2 views
0

2つの2次元配列を比較し、それらの重複を削除しようとしています。私は1D配列から重複を取り除く方法を知っていますが、2次元配列を試したことは一度もありませんでした。誰かがこれを行う方法を知っていることを期待していました。2つの異なる2次元配列から重複を削除する方法

enter image description here

enter image description here

フィールド:1D配列で、私はvar newArray = array1.Except(array2);やっただろうが、2D配列が同じように動作していないようです:(これは、私が働いているデータ型です両方のために、私の主な目標は、「elMultiArray」からここで「fMultiArray」

と一致するものを取り除くことができるように、テキストと日付をされている私が達成しようとしているものの例である:

string[,] array1 = { { "123", "09/17/17" }, { "456", "09/17/17" }, { "789", "09/18/17" } }; 
string[,] array2 = { { "147", "09/17/17" }, { "789", "09/20/17" }, { "123", "09/19/17" } }; 
//Output: string[,] array 3 = {456, 09/17/17} 

誰かが私に少なくともこの方向を教えてくれることは親切ですか?すべてありがとうございます。

+0

関連:あなたは(https://marketplace.visualstudio.com/items?itemName=AmirLiberman.ArrayVisualizer)[配列を可視化するため、このVSの拡張機能]を試してみるかもしれません。 – Amy

+0

@Amy、私はそれについて知りませんでしたが、見た目は大変便利です。ありがとう! – Sach

+3

同じ次元の2つの配列はありますか?あなたが重複を言うと、*あなたは同じ座標*で同じ値を意味しますか?最終的な出力はどのように見えますか? – code4life

答えて

1

2次元配列は、.NETフレームワークで利用可能なデータ構造が大幅に改善されているため、実際には貧弱なデータ構造です。しかし、あなたは何らかの理由でそれらを使用しなければならないと指示しましたので、ここに行きます。

通常、これは単一のLINQ文で行います。しかし、LINQには2D配列メソッドがありません。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace ConsoleApp1 { 
    class Program { 
     static void Main(string[] args) { 
      string[,] array1 = { { "123", "09/17/17" }, { "456", "09/17/17" }, { "789", "09/18/17" } }; 
      string[,] array2 = { { "147", "09/17/17" }, { "789", "09/20/17" }, { "123", "09/19/17" } }; 
      //Output: string[,] array 3 = {456, 09/17/17} 

      List<string> keys = new List<string>(); 
      Dictionary<string, string> output = new Dictionary<string, string>(); 

      // grab the first-dimension values 
      for(int index =0; index < array2.GetLength(0);index++) { 
       keys.Add(array2[index, 0]); 
      } 

      // compare they first-dimension values that we extracted to the first-dimension values in the 
      // source array. If no match is found, then it is not a duplicate entry, so record it in 
      // the output container. 
      for (int index = 0; index < array1.GetLength(0); index++) { 
       if (!keys.Contains(array1[index,0])) { 
        output.Add(array1[index, 0], array1[index, 1]); 
       } 
      } 

      // transforming the output Dictionary<> into a 2D array is left as an excersize for the reader. 

      // print output 
      foreach(var key in output.Keys) { 
       Console.WriteLine($"{key}: {output[key]}"); 
      } 
      Console.ReadKey(true); 
     } 
    } 
} 
+0

ありがとうございます@Sam Axe、私はいくつかの問題に遭遇しますが、あなたの答えが完全にうまくいったものを取り除いた後、配列の中にいくつかの重複があります。もう一度ありがとう:) – dreamheart

-1

2Dアレイは、LINQでサポートされていませんが、あなたは反復可能であるとTuple<string, string>を生み出すExcept2D()を書くことができます。 HashSet<string>を使用して重複キーを格納することができます。 Add関数を使用して、キーがすでに存在するかどうかを確認できます。

static void Main(string[] args) 
{ 
    string[,] array1 = { { "123", "09/17/17" }, { "456", "09/17/17" }, { "789", "09/18/17" } }; 
    string[,] array2 = { { "147", "09/17/17" }, { "789", "09/20/17" }, { "123", "09/19/17" } }; 

    // .ToArray() not required when only iterating once 
    // and .Length is not required 
    var elements = array1.Except2D(array2).ToArray(); 

    // make it a 2D array, if required 
    string[,] combined = new string[elements.Length, 2]; 
    for (int i = 0; i < elements.Length; i++) 
    { 
     combined[i, 0] = elements[i].Item1; 
     combined[i, 1] = elements[i].Item2; 
    } 

    Console.ReadLine(); 
} 

static IEnumerable<Tuple<string, string>> Except2D(this string[,] a, string[,] b) 
{ 
    HashSet<string> keys = new HashSet<string>(); 
    for (int index = 0; index < a.GetLength(0); index++) 
    { 
     if(keys.Add(a[index, 0])) 
     { 
      yield return new Tuple<string, string>(a[index, 0], a[index, 1]); 
     } 
    } 
} 
+0

おかげで、それは私の他の懸念、重複キーを持って、私はそれを回避する方法を見つけたが、あなたの方法はずっと良いです。ありがとう:) – dreamheart

関連する問題