2012-03-18 1 views
0

Я перехожу с моей страницы просмотра от одного до пяти изображений на контроллер.Как узнать точное количество элементов в C# Список коллекции

<input type="file" name="Images" /><br /> 
    <input type="file" name="Images" /><br /> 
    <input type="file" name="Images" /><br /> 
    <input type="file" name="Images" /><br /> 
    <input type="file" name="Images" /><br /> 

я получаю на мой контроллер, как этот

IEnumerable<HttpPostedFileBase> images 

и передача этих данных вместе с другими данными для myDomainModel я пытался с этим

List<Photo> Photos = new List<Photo>(); 
for (int i = 0; i < Images.Count(); i++) 
{ 
    foreach (var image in Images) 
    { 
     Photo p = new Photo(); 
     p.ImageMimeType = image.ContentType; 
     p.ImageData = new byte[image.ContentLength]; 
     image.InputStream.Read(p.ImageData, 0, image.ContentLength); 

     Photos.Add(p); 
    }     
} 

Но Images.Count() возвращение емкость всего списка, поэтому, когда я отправляю сообщение, скажем, 2 изображения вместо пяти, я попал в код причины, пытающегося выполнить цикл 5 раз.

Итак, вопрос заключается в том, как получить количество элементов в списке. Не вместимость.

спасибо.

+1

Какой смысл этого внешнего для цикла? Кажется, что вы перебираете коллекцию во внешнем и внутреннем петлях foreach, поэтому вы возводите в квадрат количество изображений: Images.Count = 5 => Photos.Count = 25; Images.Count = 2 => Photos.Count = 4. – sheikhjabootie

+0

Я пробовал без цикла на первом месте. Так ты предлагаешь? – BobRock

+1

Избавьтесь от цикла for. И сохраните foreach-loop. Если проблема в том, что некоторые из изображений пустые, то, возможно, оберните содержимое цикла foreach в блок if (image.ContentLength> 0) {...}. Таким образом, он будет добавлять только изображения, которые на самом деле имеют контент. Было бы лучше, если бы код на странице предоставил только правильное количество изображений. – sheikhjabootie

ответ

1

Это не совсем понятно, что происходит. Похоже, что исходная страница добавляет пустые изображения, которые пользователь не отправил? Если это так, тогда вам было бы лучше исправить это.

В противном случае, то это должно работать:

var Photos = new List<Photo>(); 

foreach (var image in Images) 
{ 
    if(image != null && image.ContentLength > 0) 
    { 
     Photo p = new Photo(); 
     p.ImageMimeType = image.ContentType; 
     p.ImageData = new byte[image.ContentLength]; 
     image.InputStream.Read(p.ImageData, 0, image.ContentLength); 

     Photos.Add(p); 
    } 
} 
+0

Я был убежден, что этот подход будет работать, прямо сейчас я пробовал этот код, но не повезло. Ссылка на объект не установлена ​​в экземпляр объекта. Если я выберу 2 изображения для загрузки внутри цикла foreach на третьей попытке, то ошибка выдается в строке if (image.ContentLength> 0) Бит путать – BobRock

+0

А в этом случае вам нужно проверить, не является ли изображение нулевым доступ к свойству ContentLength. Я отредактировал приведенный выше пример. – sheikhjabootie

1

Можете ли вы проверить, если ContentLength не является нулевым (или есть ли другое свойство, чтобы проверить, отправлено ли «Изображение»)?

Затем вы можете использовать Linq и сделать: int nbImages = Images.Count(i => i.ContentLength > 0);

+0

Я ищу в режиме отладки, изображения правильно отправлены, и если я отправляю два изображения, то в этом цикле первые две попытки в порядке, коллекция фотографий заполнена успешно, но так как она считывает емкость из 5 элементов при третьей попытке, ломается. – BobRock

+0

На самом деле это помогает if (изображение! = Null && image.ContentLength> 0) Спасибо вам, проблема решена. – BobRock