Оператор C # First-like для замены foreach при вызове массива

Я новичок в C #, но мне нужно изменить небольшую функцию, которая смотрит на массив. В коде, над которым я работаю, foreach используется для просмотра массива элементов и отображения их на веб-странице в виде элементов списка. На данный момент мне нужно найти различные блоки кода, подобные этому, и изменить их так, чтобы они не перебирали целые массивы, а выбирали определенные элементы и просто отображали их.

Если я просто хочу вытащить самый новый элемент в массиве, как бы я это сделал? Пример того, что мне нужно изменить: #foreach($product in $Website.Products) нужно изменить на что-то вроде #firstitem($product in $Website.Products)

Вот весь блок для контекста:

    <div class="slider-content">
        #if($Website.Products.Count != 0)
        <ul class="slider-list">
            #foreach($product in $Website.Products)
            <li class="slider-page">
                <div class="vdd-container">
                    <div class="vdd">
                        <blockquote>
                            <span class="quote-open"></span>
                            <q><span>${product.Message}</span></q>
                            <span class="quote-close"></span>
                        </blockquote>
                    </div>
                </div>
                <cite>
                    <strong class="pnx">${product.Name}</strong>
                </cite>
            </li>
            #end
        </ul>
        #else
        <div class="not-found">No products in store.</div>
        #end
    </div>

Опять же, просто нужно вывести первый элемент вместо того, чтобы перебирать и выполнять каждый.

Спасибо.


person user1729506    schedule 13.12.2012    source источник
comment
почему ваши массивы C # начинаются с $s?   -  person Sam I am says Reinstate Monica    schedule 13.12.2012
comment
Вы можете предоставить дополнительную информацию? Как выглядит тело вашего цикла в настоящий момент? Что это за View Engine?   -  person Simon Whitehead    schedule 13.12.2012
comment
@Sam Я просто вношу это небольшое изменение. Все вещи, с которыми я работаю, были созданы задолго до того, как меня попросили оценить их.   -  person user1729506    schedule 13.12.2012
comment
@SimonWhitehead Я не знаю последнего. Что касается основной части контента, я предоставлю ее в редакции моего исходного сообщения.   -  person user1729506    schedule 13.12.2012


Ответы (2)


Обратите внимание на методы расширения LINQ First() и / или FirstOrDefault(). Они позволяют получить первый элемент в любом IEnumerable<T>. Вы также можете указать условие, которое должно быть выполнено

http://msdn.microsoft.com/en-us/library/system.linq.enumerable.first.aspx

//Gets the first product in the Products collection
var firstProduct = Website.Products.First();

//Gets the first product where a given condition is true
var firstExpensiveProduct = Website.Products.First(p => p.Cost > 100);
person cordialgerm    schedule 13.12.2012

У вас должно быть несколько способов сделать это.

  1. Вы можете использовать метод доступа к массиву: $Website.Products[0]
  2. Вы можете использовать LINQ: $Website.Products.First()

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


Синтаксис вашего шаблона подразумевает, что вы используете механизм шаблонов nVelocity. Как упоминалось в других вопросах SO, nVelocity, похоже, не может обрабатывать методы расширения. Поскольку First() является методом расширения, это означает, что вы не можете его использовать.

Однако метод доступа к массиву должен работать.

person Moshe Katz    schedule 13.12.2012
comment
Я попробовал $Website.Products.First() и получил ошибку. Боюсь, я испортил синтаксис. Позже в коде, поскольку они проходят цикл по этому массиву и присваивают все $ product, есть бит, который читает <span>${product.Message}</span> Поскольку я отказываюсь от массива для вызова только первого элемента, могу ли я поставить ${Website.Products.First().Message}? - person user1729506; 13.12.2012
comment
@ user1729506 было бы полезно, если бы вы могли опубликовать полученную ошибку. - person Moshe Katz; 13.12.2012
comment
Просто не получить желаемого результата. Произошла ошибка, но ни один активный дампер отладочной информации, к которому у меня есть доступ, не может предоставить мне явные данные, которые я могу вам показать. Извинения. - person user1729506; 13.12.2012
comment
Если бы вы хотели просто сослаться на свойство Message, да, вы бы сделали именно это. Однако, поскольку вы сказали, что First() не работает, пробовали ли вы вместо этого использовать средство доступа к массиву ([0])? - person Moshe Katz; 13.12.2012
comment
Но есть ли ${Website.Products.First().Message} допустимый синтаксис? Он буквально выводит это на страницу-есть. Он не заменяет его данными массива. - person user1729506; 13.12.2012
comment
Если он не заменяет его, это означает, что он не может найти соответствующий метод для объекта, поэтому предполагается, что вы имеете в виду это как простой текст. Я предполагаю, что это потому, что First - это метод расширения. Другие вопросы SO подразумевают, что nVelocity испытывает трудности с вызовом методов расширения. Смотрите обновление моего ответа. - person Moshe Katz; 13.12.2012