如何将Dictionary <string,object =“”>转换为List <t>

时间:2017-04-23 10:49:36

标签: c# .net asp.net-mvc dictionary generics

我有User

public class  User
{
   public int Id { get; set; }
   public string Name { get; set; }
   public string Email { get; set; }    
}

Dictionary

public Dictionary<string, object> models = new Dictionary<string, object>
{
    {"Users[0].Id", 1},
    {"Users[0].Name", "Rajib"},
    {"Users[0].Email", "rajib@azr.com"},
    {"Users[1].Id", 2},
    {"Users[1].Name", "Ashiq"},
    {"Users[1].Email", "azhiq@azr.com"},
    {"Users[2].Id", 3},
    {"Users[2].Name", "Zaman"},
    {"Users[2].Email", "zaman@azr.com"},
};

现在我想将Dictionary<string, object> models的值转换为List<User>。 谁能建议我怎么做?

2 个答案:

答案 0 :(得分:4)

你想做什么很奇怪,我认为你应该重新考虑你的设计。也许你可以用不同的方式来构建你的数据...... 但这就是你如何实现它:

key的第一部分对数据进行分组,为每个组指定不同的User项目,并指定不同的User对象。您可以使用反射将value分配给每个正确的属性

var data = models.GroupBy(item => item.Key.Substring(0, item.Key.IndexOf(".")))
      .Select(group => group.Aggregate(new User(), (user, item) =>
      {
          PropertyInfo propertyInfo = user.GetType().GetProperty(item.Key.Substring(item.Key.IndexOf(".") + 1));
          propertyInfo.SetValue(user, Convert.ChangeType(item.Value, propertyInfo.PropertyType), null);
          return user;
      })).ToList();

答案 1 :(得分:1)

这样的事情对你有用。

var list = new List<User>();
for(var i = 0; i < models.Count/3; i++)
{
    var user = new User();
    user.Id = (int)models[string.Format("Users[{0}].Id", i)];
    user.Name = models[string.Format("Users[{0}].Name", i)].ToString();
    user.Email = models[string.Format("Users[{0}].Email", i)].ToString();
    list.Add(user);
}

但是这种Dictionary

真的很奇怪