c#从具有不同属性名称的数组创建List <object>

时间:2016-06-13 16:00:26

标签: c# arrays generics

我想知道是否可以从数组中创建一个通用列表,其中属性不同,包括数量和名称。我已经看过很多帖子可以用每个对象中的相同字段来做到这一点,但没有一个有不同的属性名称,并且它们的数量不同。

感觉应该有一种方法可以在填充我的列表时以某种方式将一个属性“映射”到另一个属性。

我可以访问一个Web服务 - 我无法控制 - 它为我提供了给定对象的许多属性;一切都名声不好,有些是无关紧要的。

我目前正在使用foreach循环遍历数组中的所有项目,然后使用我的通用列表中对象的类构造函数添加到我的List中。

如果我的数组中有大量的项目返回,这种方法开始变得非常脏,我想知道是否有更优雅的解决方案。

详细说明,假设我有一个具有以下属性的对象数组,在我无法控制的Web服务中传递给我:

  • HorribleName1(string)
  • HorribleName2(string)
  • HorribleName3(DateTime)
  • HorribleName4(int)

但我的本地课程有以下属性......

  • FirstName(字符串)
  • LastName(字符串)
  • DateOfBirth(DateTime)

我知道HorribleName1是这个人的第一个名字,而HorribleName2是姓氏。我也知道HorribleName3是他们的出生日期,而HorribleName4则无关紧要。

是否有更好的方法来创建我的通用列表:

List<myPerson> myList = new List<myPerson>();       
foreach (ArrayObject person in HorribleArray)
{
    myList.Add(new myPerson(HorribleName1, HorribleName2, HorribleName3));
}

1 个答案:

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