0

複合キーを使用して値を取得できる適切なコレクションまたはアルゴリズムはありますか?

たとえば、クラスがある場合:

    class Key
    {
        string p1{ get; }
        string p2{ get; }
        string p3{ get; }

        public Key(string p1, string p2 , string p3)
        { this.p1 = p1;  this.p2 = p2; this.p3=p3;  }
    }

次に3つのキーを作成した場合

new Key( "a","b","c")
new Key( "d","b","c")
new Key( "e","f","c")

次のキーを許可するために、反復なしのコレクションまたはアルゴリズムが必要です

new Key( null, "b","c") to return the values mapped to the first two keys,
new key( null,null,"c") to return the values mapped to all of the keys.

これを行う方法はありますか?

4

1 に答える 1

1

おそらく、これは 3 つの主要なコンポーネントの任意の組み合わせによるルックアップに適しています。ペアルックアップ (A+B) のキーは、簡単にするために単純な連結によって作成されることに注意してください。実際のキーは Tuple にする必要があります。

var keys = new[] { new Key("a", "b", c"), ... };

class Map
{
  // ... skip members declaration here
  public Map(IEnumerable<Keys> keys)
  {
    all = keys;

    mapA = keys.ToLookup(k => k.A);
    mapB = keys.ToLookup(k => k.B);
    mapC = keys.ToLookup(k => k.C);

    // should be keys.ToLookup(k => Tuple.Create(k.A, k.B))
    mapAB = keys.ToLookup(k => k.A + k.B);
    mapAC = keys.ToLookup(k => k.A + k.C);
    mapBC = keys.ToLookup(k => k.B + k.C);

    mapABC = keys.ToLookup(k => k.A + k.B + k.C);
  }

  public IEnumerable<Key> Find(Key k)
  {
    if(k.A == null && k.B == null && k.C == null) return all;

    if(k.A != null && k.B == null && k.C == null) return mapA[k.A];
    if(k.A == null && k.B != null && k.C == null) return mapB[k.B];
    if(k.A == null && k.B == null && k.C != null) return mapC[k.C];

    if(k.A != null && k.B != null && k.C == null) return mapAB[k.A+k.B];
    if(k.A != null && k.B == null && k.C != null) return mapAC[k.A+k.C];
    if(k.A == null && k.B != null && k.C != null) return mapBC[k.B+k.C];

    return mapABC[k.A+k.B+k.C];
  }
}
于 2013-04-10T21:30:15.830 に答える