C#实例化类作业:如何成对打印关联的PersonModel与AddressModel属性
错位输出的核心原因
- 你当前把人员信息、地址信息拆成了两个完全独立的集合:
List<PersonModel>和List<AddressModel>,输出时用两个连续的foreach先后遍历两个集合,自然会出现“先输出所有用户姓名,再输出所有用户地址”的错位问题。 - 由于你在录入环节是每收集完一条完整的用户数据,就同步往两个集合各添加一条记录,两个集合的元素顺序、索引位置是严格一一对应的,不需要大改代码就能实现配对展示。
两种适配你现有代码结构的实现方案
方案1:最小代码改动 同步索引遍历
这个方案完全不修改你已经写好的两个Model类、静态处理类的结构,只需要替换Main方法里的输出逻辑,把两个独立的foreach改成按索引同步遍历两个集合:
替换原有两段foreach代码为:
// 按索引同步匹配对应人员和地址 for (int i = 0; i < people.Count; i++) { ProcessPerson.GreetPerson(people[i]); ProcessPerson.SayUserAddress(address[i]); }
再把ProcessPerson里的方法输出内容调整为你需要的格式即可,不用修改方法签名:
public static class ProcessPerson { public static void GreetPerson(PersonModel person) { // 匹配要求的姓名输出格式 Console.WriteLine($"Name: {person.UserFirstName} {person.UserLastName}"); person.HasBeenGreeted = true; } public static void SayUserAddress(AddressModel userAddress) { // 匹配要求的地址排版,加换行分割每一组记录 Console.WriteLine($"Address: {userAddress.UserStreetAddress} {userAddress.UserCity}, {userAddress.UserState} {userAddress.UserZipCode}\n"); userAddress.HasBeenGreeted = true; } }
注意事项:两个集合的长度必须保持一致,一旦后续代码修改时出现某条记录漏加的情况,会触发索引越界异常,你当前的同步录入逻辑不存在这个问题。
方案2:面向对象规范写法 绑定类的关联关系
这个方案更贴合教程“类实例化关联”的考察目标,从根源上建立“人员-地址”的绑定关系,不需要维护两个独立集合,也不存在索引错位的风险:
- 给
PersonModel类增加地址关联属性,直接把对应地址对象挂到人员实例上:
public class PersonModel { public string UserFirstName { get; set; } public string UserLastName { get; set; } // 直接绑定对应的地址对象,无需单独维护地址集合 public AddressModel UserAddress { get; set; } public bool HasBeenGreeted { get; set; } }
- 调整Main方法的录入逻辑:删掉原来单独定义的
List<AddressModel>集合,创建完地址对象后,直接把地址赋值给当前人员实例的属性:
// 删掉原来的 List<AddressModel> address = new List<AddressModel>(); // 录入分支内的赋值逻辑调整为 PersonModel person = new PersonModel(); person.UserFirstName = firstName; person.UserLastName = lastName; AddressModel userAddress = new AddressModel(); userAddress.UserStreetAddress = streetAddress; userAddress.UserCity = city; userAddress.UserState = state; userAddress.UserZipCode = outputZipCode; // 建立人和地址的绑定关系 person.UserAddress = userAddress; people.Add(person);
- 输出时只需要遍历人员集合,直接读取每个人绑定的地址即可:
foreach (PersonModel p in people) { ProcessPerson.GreetPerson(p); ProcessPerson.SayUserAddress(p.UserAddress); }
最终输出效果
调整完成后控制台输出会完全匹配你要求的排版:
Name: Fred Durst Address: 1234 Fake Street N. Fake City, FS 69696 Name: Bill Muri Address: 4321 Fake Street S. Fake City, FS 69696
内容的提问来源于stack exchange,提问作者KungFuMullet
相关产品推荐
相关产品推荐

