【问题标题】:Looping through Array to set viewmodel properties. What if index doesn't exist?循环遍历数组以设置视图模型属性。如果索引不存在怎么办?
【发布时间】:2023-03-25 05:11:01
【问题描述】:

我正在遍历嵌套在另一个项目数组中的项目数组。

几乎总是,内部数组包含 5 个索引,但我正在使用的提要中可能只有 4 个索引。

当我将索引添加到我的 ViewModel 时,如果缺少第五个索引,一切都会崩溃。

如何防止在这种特定情况下出现“索引超出数组范围”错误?

private List<ImageViewModel> ConvertSmugMugModel(SmugMugGallery smugMugGallery)
{
    return smugMugGallery.Channel.Items.Select(i => new ImageViewModel
        {
            TinyImage = i.Group.Contents[0].Url, 
            ThumbnailUrl = i.Group.Contents[1].Url, 
            SmallImageUrl = i.Group.Contents[2].Url,
            MediumImageUrl = i.Group.Contents[3].Url,
            LargeImageUrl = i.Group.Contents[4].Url
        }).ToList();
}

*注意:如果使用数组不是最合适的,我不反对移动到 iCollection 或其他对象。如果不需要的话,我只是不想增加臃肿感。


编辑

Kal 在下面的评论中询问了模型的外观。

[XmlRoot("rss")]
public class SmugMugGallery
{
    [XmlElement("channel")]
    public m_Channel Channel { get; set; }
    public class m_Channel
    {
        [XmlElement("item")]
        public Item[] Items { get; set; }
        public class Item
        {
            [XmlElement("group", Namespace = "http://search.yahoo.com/mrss/")]
            public m_Group Group { get; set; }
            public class m_Group
            {
                [XmlElement("content", Namespace = "http://search.yahoo.com/mrss/")]
                public Content[] Contents { get; set; }
                public class Content
                {
                    [XmlAttribute("url")]
                    public string Url { get; set; }
                }
            }
        }
    }
}

【问题讨论】:

    标签: c# arrays nested-loops


    【解决方案1】:

    我的第一个想法就是使用 ?运算符,如下所示:

        private List<ImageViewModel> ConvertSmugMugModel(SmugMugModel smugMugGallery)
        {
            return smugMugGallery.Channel.Items.Select(i => new ImageViewModel
            {
                TinyImage = i.Group.Contents[0].Url,
                ThumbnailUrl = i.Group.Contents[1].Url,
                SmallImageUrl = i.Group.Contents[2].Url,
                MediumImageUrl = i.Group.Contents[3].Url,
                LargeImageUrl = i.Group.Contents.Count() > 4 ? i.Group.Contents[4].Url:new Url("blank")
            }).ToList();
        }
    

    您可能还想将该检查纳入其余部分,除非您 101% 确定您不会遇到少于 4 个元素。因此:

        private List<ImageViewModel> ConvertSmugMugModel(SmugMugModel smugMugGallery)
        {
            return smugMugGallery.Channel.Items.Select(i => new ImageViewModel
            {
                TinyImage = i.Group.Contents.Count() > 0 ? i.Group.Contents[0].Url:new Url("blank"),
                ThumbnailUrl = i.Group.Contents.Count() > 1 ? i.Group.Contents[1].Url:new Url("blank"),
                SmallImageUrl = i.Group.Contents.Count() > 2 ? i.Group.Contents[2].Url:new Url("blank"),
                MediumImageUrl = i.Group.Contents.Count() > 3 ? i.Group.Contents[3].Url:new Url("blank"),
                LargeImageUrl = i.Group.Contents.Count() > 4 ? i.Group.Contents[4].Url:new Url("blank")
            }).ToList();
        }
    

    【讨论】:

    • 你不知道。我用i.Group.Contents.Length() 尝试了同样的事情,但惨遭失败。我想我应该阅读我的方法。
    • 现在我很好奇 Group.Contents 对象是什么类型,因为我希望 .Count 是一个属性而不是一个方法。
    猜你喜欢
    • 1970-01-01
    • 2022-06-30
    • 2014-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多