能否将处理AwayTalks的C#代码片段移至对象初始化块?
能否将指定代码片段移至对象初始化代码块中?
给定代码:
public WeekendMeetingHistoryItem[] ExtractFutureWeekendMeetingHistoryItems(DateTime datWeekOfMeeting, String strHistoryDatabase) { List<WeekendMeetingHistoryItem> listHistoryItems = new List<WeekendMeetingHistoryItem>(); try { // Read the XML file XDocument docAssignHistory = XDocument.Load(strHistoryDatabase); var listHistory = docAssignHistory.Descendants("PublicTalkInfo") .Where(x => ConvertWeekNameToDate(x.Parent.Name.ToString()) > datWeekOfMeeting); foreach (XElement nodeHistoryItem in listHistory) { DateTime datHistoryItemWeekOfMeeting = ConvertWeekNameToDate(nodeHistoryItem.Parent.Name.ToString()); WeekendMeetingHistoryItem oItem = new WeekendMeetingHistoryItem { Week = datHistoryItemWeekOfMeeting, Chairman = nodeHistoryItem.Element("PublicTalkChairman")?.Value, OpeningPrayer = nodeHistoryItem.Element("PrayerOpen")?.Value, ConcludingPrayer = nodeHistoryItem.Element("PrayerClose")?.Value, Host = nodeHistoryItem.Element("VideoConferenceHost")?.Value, Cohost = nodeHistoryItem.Element("VideoConferenceCohost")?.Value, HomeSpeaker = nodeHistoryItem.Element("PublicTalkSpeaker")?.Value, Interpreter = nodeHistoryItem.Element("Interpreter")?.Value, Hospitality = nodeHistoryItem.Element("PublicTalkHospitality")?.Value, AwaySpeaker1 = nodeHistoryItem.Element("AwaySpeaker1")?.Value, AwaySpeaker2 = nodeHistoryItem.Element("AwaySpeaker2")?.Value, WatchtowerConductor = nodeHistoryItem.Element("WatchtowerConductor")?.Value, WatchtowerReader = nodeHistoryItem.Element("WatchtowerReader")?.Value, WatchtowerBibleVersesReader = nodeHistoryItem.Element("BibleVersesReader")?.Value, Miscellaneous = nodeHistoryItem.Element("Misc")?.Value }; var awayTalks = nodeHistoryItem.Element("AwayTalks"); if (awayTalks != null) { var awayTalkList = awayTalks.Descendants("AwayTalk"); if (awayTalkList != null) { foreach (var awayTalkItem in awayTalkList) { AwayTalk item = new AwayTalk { Speaker = awayTalkItem.Element("Speaker").Value, Congregation = awayTalkItem.Element("Congregation").Value, TalkNumber = awayTalkItem.Element("TalkNumber").Value, MeetingDate = DateTime.Parse(awayTalkItem.Element("MeetingDate").Value) }; oItem.AwayTalks.Add(item); } } } listHistoryItems.Add(oItem); } } catch (Exception ex) { SimpleLog.Log(ex); return null; } return listHistoryItems.ToArray(); }
待移动的代码片段:
var awayTalks = nodeHistoryItem.Element("AwayTalks"); if (awayTalks != null) { var awayTalkList = awayTalks.Descendants("AwayTalk"); if (awayTalkList != null) { foreach (var awayTalkItem in awayTalkList) { AwayTalk item = new AwayTalk { Speaker = awayTalkItem.Element("Speaker").Value, Congregation = awayTalkItem.Element("Congregation").Value, TalkNumber = awayTalkItem.Element("TalkNumber").Value, MeetingDate = DateTime.Parse(awayTalkItem.Element("MeetingDate").Value) }; oItem.AwayTalks.Add(item); } } }
问题:
能否将上述待移动的代码片段移至WeekendMeetingHistoryItem oItem = new WeekendMeetingHistoryItem{...}的对象初始化代码块中?
回答:
完全可以,借助LINQ查询和集合初始化器,就能把这段逻辑整合到对象初始化代码块里,同时还能简化原来的空值判断逻辑(Descendants方法即使没有匹配元素也会返回空集合,而非null,所以不需要额外判断awayTalkList是否为null)。
修改后的完整初始化代码如下:
WeekendMeetingHistoryItem oItem = new WeekendMeetingHistoryItem { Week = datHistoryItemWeekOfMeeting, Chairman = nodeHistoryItem.Element("PublicTalkChairman")?.Value, OpeningPrayer = nodeHistoryItem.Element("PrayerOpen")?.Value, ConcludingPrayer = nodeHistoryItem.Element("PrayerClose")?.Value, Host = nodeHistoryItem.Element("VideoConferenceHost")?.Value, Cohost = nodeHistoryItem.Element("VideoConferenceCohost")?.Value, HomeSpeaker = nodeHistoryItem.Element("PublicTalkSpeaker")?.Value, Interpreter = nodeHistoryItem.Element("Interpreter")?.Value, Hospitality = nodeHistoryItem.Element("PublicTalkHospitality")?.Value, AwaySpeaker1 = nodeHistoryItem.Element("AwaySpeaker1")?.Value, AwaySpeaker2 = nodeHistoryItem.Element("AwaySpeaker2")?.Value, WatchtowerConductor = nodeHistoryItem.Element("WatchtowerConductor")?.Value, WatchtowerReader = nodeHistoryItem.Element("WatchtowerReader")?.Value, WatchtowerBibleVersesReader = nodeHistoryItem.Element("BibleVersesReader")?.Value, Miscellaneous = nodeHistoryItem.Element("Misc")?.Value, // 整合AwayTalks的初始化逻辑 AwayTalks = nodeHistoryItem.Element("AwayTalks")? .Descendants("AwayTalk") .Select(awayTalkItem => new AwayTalk { Speaker = awayTalkItem.Element("Speaker").Value, Congregation = awayTalkItem.Element("Congregation").Value, TalkNumber = awayTalkItem.Element("TalkNumber").Value, MeetingDate = DateTime.Parse(awayTalkItem.Element("MeetingDate").Value) }) .ToList() ?? new List<AwayTalk>() };
说明:
- 使用
?.操作符对nodeHistoryItem.Element("AwayTalks")做空值安全访问,如果该元素不存在,直接返回空列表(new List<AwayTalk>()),避免AwayTalks为null。 - 通过
Select方法将每个<AwayTalk>元素映射为AwayTalk对象,最后用ToList()转换为列表,直接赋值给AwayTalks属性。 - 这样修改后,原来单独的循环和判断代码可以完全删除,所有对象初始化逻辑集中在一起,代码更简洁紧凑。
内容的提问来源于stack exchange,提问作者Andrew Truckle
相关产品推荐
相关产品推荐

