2

ジャグ配列から個別の値を取得する方法を探しています。辞書に入れてみましたが、値がはっきりしていないようです。誰か解決策のアイデアはありますか?これが私がこれまでに持っているものです:

int[][] connectionList = GetArray();

これから返されたサンプルデータ:

[0][1, 130, 136, 138]
[1][1, 78, 126, 138]
[2][1, 10, 125, 138]
[3][1, 130, 136, 138]
[4][1, 78, 126, 138]
[5][1, 130, 136, 138]
[6][1, 72, 135, 138]
[7][1, 73, 135, 138]
[8][1, 130, 136, 138]

辞書に追加してみました。追加されたときに重複する値をキャッチしようとしましたが、それは機能しなかったので、.Distinct()を追加しようとしましたが、そこにも喜びはありません

Dictionary<int, int[]> myDictionary = new Dictionary<int, int[]>();
for (int i = 0; i < connectionList.Length; i++)
{ 
    List<int> list = new List<int>();
    for (int j = 0; j < connectionList[i].Length; j++)
    {
        list.Add(connectionList[i][j]);        
    }
    if (myDictionary.Where(x => x.Value == list.ToArray()).Count() == 0)
        myDictionary.Add(i, list.ToArray());
}
var distinctList = myDictionary.Values.Distinct().ToList();

上記のリストから、私が探している出力は次のようになります。

[0][1, 130, 136, 138]
[1][1, 78, 126, 138]
[2][1, 10, 125, 138]
[4][1, 72, 135, 138]
[5][1, 73, 135, 138]

どうすればこれを達成できるか考えていますか?

4

3 に答える 3

4

これを行う1つの方法は次のとおりです。

var distinctList = connectionList.GroupBy(x => string.Join(",", x))
                                 .Select(g => g.First())
                                 .ToList();

比較に使用する使い捨ての文字列を作成するよりも、カスタムを作成する方がおそらく望ましいですが( Crab BucketTobiasIEqualityComparer<T>によって提案されているように)。

于 2012-01-30T16:13:33.067 に答える
2

これはLINQを使用すると簡単になりDistinctます。必要なのは、次の独自の実装を提供することだけですIEqualityComparer

public class IntArrayComparer : IEqualityComparer<int[]>
{
    public bool Equals(int[] i1, int[] i2)
    {
        if(ReferenceEquals(i1, i2))
        {
            return true;
        }
        else if(i1 == null || i2 == null)
        {
            return false;
        }
        else if(i1.Length != i2.Length)
        {
            return false;
        }

        for(int i = 0; i < i1.Length; ++i)
        {
            if(i1[i] != i2[i]) return false;
        }

        return true;
    }

    public int GetHashCode(int[] obj)
    {
        // Average is probably not the best hash for an int array,
        // but I'm lazy right now and this is only for demonstration purposes
        return obj != null ? (int)obj.Average() : 0;
    }
}

そして、次のようにコードで使用します。

int[][] connectionList = GetArray().Distinct(new IntArrayComparer()).ToArray();
于 2012-01-30T16:32:23.417 に答える
1

IEqualityComparerを使用できますか

 public class MyComparer : IEqualityComparer<int []> 
    {     
        bool IEqualityComparer<int[]>.Equals(int[] x, int[] y)     
        {         
             //.. your particular comparison logic goes here
        }
        int IEqualityComparer<int[]>.GetHashCode(int [] obj)     
        {         
            return obj.GetHashCode();     
        }     

    } 

次に、このように呼び出します

var distinctList = myDictionary.Values.Distinct(new MyComparer()).ToList(); 
于 2012-01-30T16:31:58.613 に答える