You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否将处理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>()
};

说明:

  1. 使用?.操作符对nodeHistoryItem.Element("AwayTalks")做空值安全访问,如果该元素不存在,直接返回空列表(new List<AwayTalk>()),避免AwayTalks为null。
  2. 通过Select方法将每个<AwayTalk>元素映射为AwayTalk对象,最后用ToList()转换为列表,直接赋值给AwayTalks属性。
  3. 这样修改后,原来单独的循环和判断代码可以完全删除,所有对象初始化逻辑集中在一起,代码更简洁紧凑。

内容的提问来源于stack exchange,提问作者Andrew Truckle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 13:53:10