Цикл по массиву для установки свойств viewmodel.Что делать, если индекс не существует? - PullRequest
0 голосов
/ 12 марта 2012

Я перебираю массив элементов, вложенных в другой массив элементов.

Почти всегда внутренний массив содержит 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 или какой-либо другой объект, если использование массива не наилучшим образом подходит.Я просто не хотел добавлять раздувание, если мне не нужно.


Редактировать

Кал спросил, как выглядит модель в комментарииниже.

[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; }
                }
            }
        }
    }
}

1 Ответ

4 голосов
/ 12 марта 2012

Моя первая мысль просто использовать? оператор, вот так:

    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 элементами. Thusly:

    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();
    }
...