我有dictionary<String,Object>
,我想将其转换为List<Customer>
这样做有一个聪明的方法吗?
任何例子?
感谢
EDITED
很抱歉没有正确解释。 鉴于以下原因,为什么我的结果为0? 请注意我试图模拟一个现场情况,第一个键没有意义,并希望排除所以只有我应该得到的客户。 为什么不起作用?感谢您的任何建议
class Program
{
static void Main(string[] args)
{
List<Customer> oldCustomerList = new List<Customer>
{
new Customer {Name = "Jo1", Surname = "Bloggs1"},
new Customer {Name = "Jo2", Surname = "Bloggs2"},
new Customer {Name = "Jo3", Surname = "Bloggs3"}
};
Dictionary<string,object>mydictionaryList=new Dictionary<string, object>
{
{"SillyKey", "Silly Value"},
{"CustomerKey", oldCustomerList}
};
List<Customer> newCustomerList = mydictionaryList.OfType<Customer>().ToList();
newCustomerList.ForEach(i=>Console.WriteLine("{0} {1}", i.Name, i.Surname));
Console.Read();
}
}
public class Customer
{
public string Name { get; set; }
public string Surname { get; set; }
}
答案 0 :(得分:16)
一定有办法实现,但你没有说过客户的内容,或者字符串,对象和客户之间的关系。
以下是可能适合的示例(假设您使用的是.NET 3.5或更高版本):
var customers = dictionary.Select(pair => new Customer(pair.Key, pair.Value)
.ToList();
或者您可能只对密钥感兴趣,密钥应该是客户的名称:
var customers = dictionary.Keys.Select(x => new Customer(x))
.ToList();
或者每个值都可能是Customer
,但您需要投射:
var customers = dictionary.Values.Cast<Customer>().ToList();
或者您的某些值可能是Customer
值,但其他值不是,您想跳过这些值:
var customers = dictionary.Values.OfType<Customer>().ToList();
(你也可以使用List<T>
的构造函数,它带有IEnumerable<T>
,但我倾向于发现ToList
扩展方法更具可读性。)
编辑:好的,现在我们知道要求,选项是:
List<Customer> customers = dictionary.Values.OfType<List<Customer>>()
.First();
或
List<Customer> customers = dictionary.Values.OfType<List<Customer>>()
.FirstOrDefault();
如果没有这样的值,后者会给你null
;前者将抛出异常。
答案 1 :(得分:1)
根据您更新的代码,列表中的相关对象是List<Customer>
,因此您应该使用OfType检查。尝试这样的事情,从你字典中的所有列表中形成一个列表。
var newList = mydictionaryList.Values.OfType<List<Customer>>().SelectMany(list => list).ToList();
否则,您可以获得列表清单。