如何使用Dictionary / List <document>过滤此数据?

时间:2015-11-06 09:14:58

标签: c# list dictionary 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();



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

类型&#39; System.Collections.Generic.KeyNotFoundException&#39;的例外情况发生在mscorlib.dll中但未在用户代码中处理

附加信息:字典中没有给定的密钥。

任何人都可以帮我修复它吗?

2 个答案:

答案 0 :(得分:0)

鉴于您提到的例外,我怀疑在您尝试访问字典之前应该检查字典的调用,因此而不是

_allUsers[s.Get("ObjStylist")]

你可以尝试

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

同样适用于_allDepartments[s.Get("ObjDepartment")]_allProducts[s.Get("ObjProduct")]

答案 1 :(得分:0)

问题是,您正在尝试查找字典中不存在的密钥。例如:_allUsers[s.Get("ObjStylist")]如果s.Get("ObjStylist")包含不存在的密钥,您将收到此错误。

因此,词典的TryGetValue()方法非常有用,因为您只需要查找关键词(而不是使用Contains()dict[key])< / em>的

你可以创建一个查找函数,它返回它存在的值(这个泛型函数适用于所有字典)

(此示例未经过测试,可能需要进行一些调整)

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();