2017-11-20 4 views
0

私は、匹敵しないフィールド値でそれらをグループ化する連想コンテナに入れたいオブジェクトをいくつか持っています。私は以下の持っていたので、場合:類似しないオブジェクトをグループ化するSortedSetのようなコンテナがありますか?

using System.Collections.Generic; 
using Pair = System.Tuple<Penguin, int>; 

class Penguin {} 

class Whatever { 

    public static void Main(string[] args) { 
     Penguin emperor = new Penguin(), 
       adelie = new Penguin(), 
       batmanVillain = new Penguin(); 

     var okay = new HypotheticalCollection<Pair>(5); 

     okay.Add(new Pair(emperor, 1)); 
     okay.Add(new Pair(adelie, 2)); 
     okay.Add(new Pair(batmanVillain, 3)); 
     okay.Add(new Pair(emperor, -500)); 
     okay.Add(new Pair(batmanVillain, 5)); 

    } 
} 

を、私はHypotheticalCollectionを繰り返し処理、私は一緒に一緒に2回のemperorエントリーと2つのbatmanVillainのエントリを見たいだろうが、私は最初にどちらのを気にしません。しかし、私は対数時間でエントリを参照できるようにしたいと思います。

私がC++を使用していた場合は、アドレスでPenguinをソートするだけですが、C#ではその贅沢はありません。今は各オブジェクトにシリアル番号を割り当てることで処理していますが、これはハッキリのような感じです。余分なスペースを必要としません。より良い方法は、おそらくReferenceLessThan関数か何かですか?

+0

なぜ[comparer](https://stackoverflow.com/questions/14336416/using-icomparer-for-sorting)を書きませんか?作成したら、SortedSet [constructor](https://msdn.microsoft.com/en-us/library/dd395024(v = vs.110).aspx)に渡すことができます。 – john

答えて

1

オプション1:(提案)

public static class Whatever 
{ 
    class Penguin 
    { 
     private Guid id = Guid.NewGuid();  
     public Guid GetId() { return id; } 
    } 

    public static void Main(string[] args) 
    { 
     Penguin emperor = new Penguin(), 
      adelie = new Penguin(), 
      batmanVillain = new Penguin(); 

     var okay = new List<KeyValuePair<Penguin, int>>(); 
     okay.Add(new KeyValuePair<Penguin, int>(emperor, 1)); 
     okay.Add(new KeyValuePair<Penguin, int>(adelie, 2)); 
     okay.Add(new KeyValuePair<Penguin, int>(batmanVillain, 3)); 
     okay.Add(new KeyValuePair<Penguin, int>(emperor, -500)); 
     okay.Add(new KeyValuePair<Penguin, int>(batmanVillain, 5)); 

     okay.Sort((a, b) => a.Key.GetId().CompareTo(b.Key.GetId())); 

     // Iterate 'okay' 
    } 
} 

オプション2はthisに係る固定アドレスではなく、CLRによって変更することができる機能を、比較ソートに対象アドレスを使用することです。さらに、アドレスを取得するには、unsafeフラグを使用してアプリを構築する必要があります。あなたがオプション1が "ハッピー"だと感じるなら、csharaplyオプション2はスーパー "ハッキー"です。 GUIDは128ビットの整数(16バイト)です。

関連する問題