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

Kar*_*arl 0 c# arrays generics

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

当填充我的List时,感觉应该有一种方法将某个属性"映射"到另一个属性.

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

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

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

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

  • HorribleName1(String)
  • HorribleName2(String)
  • HorribleName3(日期时间)
  • 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));
}
Run Code Online (Sandbox Code Playgroud)

mad*_*dd0 6

它纯粹是审美的,但您可以使用LINQ来投影您的数据,如下所示:

List<myPerson> myList = (from person in HorribleArray
                         select new Person()
                         {
                             FirstName = person.horribleName1, 
                             Lastname = person.horribleName2, 
                             Birthday = person.HorribleName3
                         }).ToList();
Run Code Online (Sandbox Code Playgroud)

实际上,正如Jim建议的那样,您仍然可以使用相同的构造函数语法,而不是使用对象初始化器.

List<myPerson> myList = (from person in HorribleArray
                         select new Person(person.horribleName1, person.horribleName2, person.HorribleName3)).ToList();
Run Code Online (Sandbox Code Playgroud)

但是,我个人认为,特别是在投影更改名称的属性时,对象初始化程序使代码更具可读性.

在Jim的评论之后,我同意您可能不希望公开属性以使用初始化程序,因此另一种选择是使用命名参数:

List<myPerson> myList = (from person in HorribleArray
                         select new Person(
                             firstName: person.horribleName1,
                             lastName: person.horribleName2, 
                             birthday: person.HorribleName3)).ToList();
Run Code Online (Sandbox Code Playgroud)