2011-03-13 26 views
2

嗨 我想使用通过使用NHibenrate读取数据库并具有1000条记录而获得的数据传输对象,并且我需要谨慎使用此DTo,其中基于某个键我选择一个值。我的DTO会像这样变成东西。带有O(1)查找的数据传输对象

public class DTO 
{ 
    string name; 
    int id; 
    int schoolId; 
    double value; 
} 

现在的问题是,我得到这个作为一个枚举。现在基于该schoolid ID和姓名,我需要选择一个值,我做截至目前,因为这可枚举如下:

DtoList.Where(x=>x.name="name" && x.id=1 && x.schoolId=2).First(); 

现在的问题是这是一个O(n)查找,我希望它是O(1)可以通过使用IDictionary来完成。

我想知道如果我可以让这个DTO实现IDitcionary,然后做同样的事情。 \

这可能吗?我认为这更多来自c#的角度。

同样从NHibernate的角度来看这将如何解决。

+0

将这项工作为你 ? http://ayende.com/blog/4548/nhibernate-streaming-large-result-sets – 2015-05-11 17:13:27

回答

0

如果你曾经构建列表,然后多次查找它,也许这是值得创建另一个对象,其中将包括一个字典,并从DTO的集合创建它:

struct Key 
{ 
    string Name; 
    int Id; 
    int SchoolId; 
} 

class DictionaryObject 
{ 
    IDictionary<Key, double> _dict; 

    public DictionaryObject(IEnumerable<Dto> dtoList) 
    { 
     _dict = dtoList.ToDictionary(
      o => new Key { Name = o.Name, Id = o.Id, SchoolId = o.SchoolId }, 
      o => o.Value); 
    } 

    double GetValue(string Name, int Id, int SchoolId) 
    { 
     // if the key exists then... 
     return _dict[new Key { Name = Name, Id = Id, SchoolId = SchoolId }]; 
    } 

    ... 
} 
+0

我如何转换它给出的例子提到..我如何生成密钥? – Mary 2011-03-13 17:32:30

+0

@玛丽,我编辑了答案,你觉得现在更清楚了吗? – 2011-03-13 17:38:32

+0

我想知道做这个关键的收益是多少。同时使用这本字典我需要建立一个密钥,再次nt最佳。 – Mary 2011-03-13 17:40:44