2015-11-06 54 views
2


我需要一些帮助在这里为我的代码。如何使用词典/列表筛选此数据<Document>?

我写了这段代码。

List<Document> doc = SystemOperationManager.GetSalesByMemberLucene(ConfigurationManager.GetIndexPath(), memberId).ToList(); 

Dictionary<string, Department> _allDepartments = DepartmentManager.GetAll().ToDictionary(s => s.Id.ToString(), s => s); 
Dictionary<string, User> _allUsers = UserManager.GetAll().ToDictionary(s => s.Id.ToString(), s => s); 
Dictionary<string, Product> _allProducts = ProductManager.GetAll().Where(x => x.CustomType == 2).ToDictionary(s => s.Id.ToString(), s => s); 

List<SystemOperation> so = doc.Select(s => new SystemOperation 
{ 
    ObjStylist = s.Get("ObjStylist") != null ? _allUsers[s.Get("ObjStylist")] : null, 
    ObjDepartment = s.Get("ObjDepartment") != null ? _allDepartments[s.Get("ObjDepartment")] : null, 
    ObjProduct = s.Get("ObjProduct") != null ? _allProducts[s.Get("ObjProduct")] : null 
    //TotalPointsCollected = decimal.Parse(s.Get("TotalPointsCollected")), 
    //PointsAccumulated = decimal.Parse(s.Get("PointsAccumulated")) 
}).ToList(); 

_result = so; 
rgList.DataSource = _result; 
rgList.DataBind(); 



当我运行的代码它说,它有这个错误。

类型“System.Collections.Generic.KeyNotFoundException”的一个例外发生在mscorlib.dll但在用户代码中没有处理

附加信息:给定的键不存在在词典中。

任何人都可以帮我解决它吗?

+0

请提供完整的例外WITH stacktrace或至少是发生此错误的行。 –

+1

你必须检查每个字典查找'if(yourdictionary.ConatiansKey(“yourkey”))'.... – Milen

+0

什么样的类是'SystemOperation'?它是什么方法'Get'做什么,它返回什么? –

回答

0

给你所提到的例外,我怀疑您尝试访问他们之前的字典调用应进行检查,所以不是

_allUsers[s.Get("ObjStylist")] 

你可以尝试

_allUsers.ContainsKey(s.Get("ObjStylist")) ? _allUsers[s.Get("ObjStylist")] : null 

也是如此_allDepartments[s.Get("ObjDepartment")]_allProducts[s.Get("ObjProduct")]

0

问题是,您正在尝试查找字典中不存在的键。例如:_allUsers[s.Get("ObjStylist")]如果s.Get("ObjStylist")包含不存在的键,则会出现此错误。

为此字典的TryGetValue()方法是非常有用的,因为你只会看到了那些关键(而不是使用Contains()dict[key]

您可以创建返回值的查找功能是它的存在(这泛型函数将所有字典工作)

(本例中没有进行测试,可能需要一些调整)

private T LookupData<T>(Dictionary<string, T> dict, string key) 
{ 
    if(key == null) 
     return null; 

    T result; 

    if(dict.TryGetValue(key, out result)) 
     return result; 
    else 
     return null; 

} 



List<Document> doc = SystemOperationManager.GetSalesByMemberLucene(ConfigurationManager.GetIndexPath(), memberId).ToList(); 

Dictionary<string, Department> _allDepartments = DepartmentManager.GetAll().ToDictionary(s => s.Id.ToString(), s => s); 
Dictionary<string, User> _allUsers = UserManager.GetAll().ToDictionary(s => s.Id.ToString(), s => s); 
Dictionary<string, Product> _allProducts = ProductManager.GetAll().Where(x => x.CustomType == 2).ToDictionary(s => s.Id.ToString(), s => s); 

List<SystemOperation> so = doc.Select(s => new SystemOperation 
{ 
    ObjStylist = LookupData<User>(_allUsers, s.Get("ObjStylist")), 
    ObjDepartment = LookupData<Department>(_allDepartments, s.Get("ObjDepartment")), 
    ObjProduct = LookupData<Product>(_allProducts, s.Get("ObjProduct")) 
    //TotalPointsCollected = decimal.Parse(s.Get("TotalPointsCollected")), 
    //PointsAccumulated = decimal.Parse(s.Get("PointsAccumulated")) 
}).ToList(); 

_result = so; 
rgList.DataSource = _result; 
rgList.DataBind();