【问题标题】:C# "First"-like statement to replace foreach when calling an array调用数组时替换 foreach 的 C#“First”-like 语句
【发布时间】:2012-12-13 02:18:48
【问题描述】:

我对 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>

同样,只需要输出第一项,而不是循环执行每一项。

谢谢。

【问题讨论】:

  • 为什么你的c#数组以$s开头?
  • 您能提供更多信息吗?你的循环体现在是什么样子的?这是什么视图引擎?
  • @Sam 我只是自己做这个小改动。我正在使用的所有东西都是在我被要求使用它之前很久就制作的。
  • @SimonWhitehead 我不知道后者。至于内容的正文,我将在我的原始帖子的编辑中提供。

标签: c# arrays foreach nvelocity


【解决方案1】:

查看 LINQ First() 和/或 FirstOrDefault() 扩展方法。它们允许您获取任何IEnumerable&lt;T&gt; 中的第一项。您还可以指定必须满足的条件

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);

【讨论】:

    【解决方案2】:

    您应该能够通过多种方式做到这一点。

    1. 您可以使用数组访问器:$Website.Products[0]
    2. 您可以使用 LINQ:$Website.Products.First()

    第一个选项在处理简单数组时效率更高。后一个选项在某些情况下可能看起来更好,并且如果您使用某些类型的集合(而不是简单的数组)可能会表现更好。


    您的模板语法暗示您正在使用 nVelocity 模板引擎。正如other SO questions 中提到的,nVelocity 似乎无法处理扩展方法。由于First()是扩展方法,所以不能使用。

    数组访问器应该可以工作。

    【讨论】:

    • 我尝试了$Website.Products.First() 并得到了一个错误。我担心我弄乱了语法。在后面的代码中,由于他们正在循环遍历这个数组并将所有内容分配给 $product,所以有一点读取 &lt;span&gt;${product.Message}&lt;/span&gt; 因为我放弃了数组只调用第一项,我会放 ${Website.Products.First().Message} 吗?跨度>
    • @user1729506 如果您可以发布您收到的错误信息,将会很有帮助。
    • 只是没有得到想要的输出。发生错误,但没有我有权访问的活动调试信息转储程序可以给我明确的数据来显示给你。道歉。
    • 如果您只想引用 Message 属性,是的,您会这样做。但是,既然您说First() 不起作用,您是否尝试过使用数组访问器([0])来代替?
    • ${Website.Products.First().Message} 是有效的语法吗?它从字面上输出这个在页面上。它不会用数组数据替换它。
    猜你喜欢
    • 2014-09-02
    • 2014-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多