使用复合键查询集合,其中关键部分可以匹配“任何”

时间:2013-04-10 21:02:37

标签: c# collections

是否有适当的集合或算法允许我使用复合键获取值,其中查询键的某些部分可能为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.

有没有办法做到这一点?

1 个答案:

答案 0 :(得分:1)

这可能会通过三个关键组件的任意组合进行查找。请注意,为简单起见,通过简单的concat创建对查找(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];
  }
}