KeyValue< - > ValueKey - 字典访问内存高效

时间:2016-05-13 09:04:13

标签: c# dictionary

我有以下课程

select *

目前我有大约100.000条Foo,Foo1,Foo2的HashSets

public class Foo
{
    public Bar Bar { get; set; }
}

public class Foo1
{
    public Bar Bar { get; set; }
}

public class Foo2
{
    public Bar Bar { get; set; }
}

public class BaseFoo
{

}

public class Bar
{

}

如果Foo已经存在以及HashSet附带的所有其他好处,这可以很好地检查。

现在我的要求是检查列表中是否有一个带有特定Bar的Foo并将其返回。

目前我这样做:

public HashSet<Foo> Foos { get; set; }
public HashSet<Foo1> Foo1s { get; set; }
public HashSet<Foo1> Foo2s { get; set; }

可悲的是,这段代码相当慢,因为它可能发生在我的应用程序中,我需要检查100.000或更多(如果有新的Foos要创建)条形码,如果它们在Foos集合内。

所以GetFooByBar方法经常被执行,因为每次它都不是很快就遍历整个列表。

我考虑过如下实现一个额外的字典:

public Foo GetFooByBar(Bar bar)
{
    return Foos.FirstOrDefault(x => object.ReferenceEquals(x.Bar, Bar));
}
public Foo GetFoo1ByBar(Bar bar)
{
    return Foo1s.FirstOrDefault(x => object.ReferenceEquals(x.Bar, Bar));
}
public Foo GetFoo2ByBar(Bar bar)
{
    return Foo2s.FirstOrDefault(x => object.ReferenceEquals(x.Bar, Bar));
}

然后像这样重写我的GetFooByBar方法:

Dictionary<Bar, Foo> Foo_Bars { get; set; }
Dictionary<Bar, Foo> Foo1_Bars { get; set; }
Dictionary<Bar, Foo> Foo2_Bars { get; set; }

有了这个,我担心内存问题,因为我会比我的每个类中有大约90个有1个HashSet和1个字典,并不是所有90个都可以有100.000个条目,它变化很大,但它可以很容易地大约5.000总共.000个条目。 (每班约55.000)

我还想过只做一个包含Foo基类的Dictionary,而不是为每个类做一个额外的字典:

public Foo GetFooByBar(Bar bar)
{
    Foo foo;
    Foo_Bars.TryGetValue(bar, out foo)
    return foo;
}
public Foo GetFoo1ByBar(Bar bar)
{
    Foo foo;
    Foo1_Bars.TryGetValue(bar, out foo)
    return foo;
}
public Foo GetFoo1ByBar(Bar bar)
{
    Foo foo;
    Foo2_Bars.TryGetValue(bar, out foo)
    return foo;
}

使用这样的GetFooByBar方法:

Dictionary<Bar, BaseFoo> Bars { get; set; }

但是有了这个,我最终会得到1个带有5.000.000个词条的词典。

你们有不同的想法,如果我的方式是唯一可能考虑到内存和性能的更好的方法吗?!

0 个答案:

没有答案