我想知道是否可以从数组中创建一个通用列表,其中属性不同,包括数量和名称。我已经看过很多帖子可以用每个对象中的相同字段来做到这一点,但没有一个有不同的属性名称,并且它们的数量不同。
感觉应该有一种方法可以在填充我的列表时以某种方式将一个属性“映射”到另一个属性。
我可以访问一个Web服务 - 我无法控制 - 它为我提供了给定对象的许多属性;一切都名声不好,有些是无关紧要的。
我目前正在使用foreach循环遍历数组中的所有项目,然后使用我的通用列表中对象的类构造函数添加到我的List中。
如果我的数组中有大量的项目返回,这种方法开始变得非常脏,我想知道是否有更优雅的解决方案。
详细说明,假设我有一个具有以下属性的对象数组,在我无法控制的Web服务中传递给我:
但我的本地课程有以下属性......
我知道HorribleName1是这个人的第一个名字,而HorribleName2是姓氏。我也知道HorribleName3是他们的出生日期,而HorribleName4则无关紧要。
是否有更好的方法来创建我的通用列表:
List<myPerson> myList = new List<myPerson>();
foreach (ArrayObject person in HorribleArray)
{
myList.Add(new myPerson(HorribleName1, HorribleName2, HorribleName3));
}
答案 0 :(得分:6)
这纯粹是审美的,但您可以使用LINQ来投影您的数据:
List<myPerson> myList = (from person in HorribleArray
select new Person()
{
FirstName = person.horribleName1,
Lastname = person.horribleName2,
Birthday = person.HorribleName3
}).ToList();
事实上,正如Jim建议的那样,您仍然可以使用相同的构造函数语法,而不是使用对象初始化器。
List<myPerson> myList = (from person in HorribleArray
select new Person(person.horribleName1, person.horribleName2, person.HorribleName3)).ToList();
但是,我个人认为,特别是在投影更改名称的属性时,对象初始化程序会使代码更具可读性。
在Jim的评论之后,我同意您可能不希望公开属性以使用初始化者,因此另一种选择是使用命名参数:
List<myPerson> myList = (from person in HorribleArray
select new Person(
firstName: person.horribleName1,
lastName: person.horribleName2,
birthday: person.HorribleName3)).ToList();