0

是否有适当的集合或算法允许我使用复合键获取值,在查询部分键时可能为 null 以表示匹配任何值?

例如,如果我有课程:

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

如果我然后创建了三个键,例如

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

可能这可以通过三个关键组件的任意组合进行查找。请注意,为简单起见,配对查找 (A+B) 的键是由简单的 concat 创建的。真正的键应该是元组。

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 回答