Asp.Net C#具有不同条件的嵌套foreach

时间:2016-07-01 22:37:00

标签: c# asp.net foreach nested

我有一个包含这样数据的表:

ProductId ProductName ProductPropertyOne ProductPropertyTwo ProductSortOrder --------- ----------- ------------------ ------------------ --------- 1 Product 01 Propery-A Value-01 100 1 Product 01 Propery-A Value-02 100 1 Product 01 Propery-A Value-03 100 1 Product 01 Propery-A Value-04 100 1 Product 01 Propery-B Value-01 100 1 Product 01 Propery-B Value-02 100 2 Product 02 Propery-B Value-01 200 2 Product 02 Propery-B Value-02 200 2 Product 02 Propery-B Value-03 200 2 Product 02 Propery-A Value-01 200 3 Product 03 Propery-A Value-01 100 3 Product 03 Propery-A Value-02 100 3 Product 03 Propery-C Value-01 100 3 Product 03 Propery-C Value-02 100 3 Product 03 Propery-C Value-03 100 3 Product 03 Propery-C Value-04 100

我正在我的页面中循环这些数据,如下所示:

<%
MyEntities db = new MyEntities();
my_ProductList = db.Product.Where(it => it.ProductPropertyOne == "Propery-A").OrderBy(it => it.ProductSortOrder).ToList();

foreach (MyData.Product Product in my_ProductList) {
%>
<a href="#"><%=Product.Name%></a>
<%}%>

但实际上我想要一个这样的列表:

<a href="#" data-Value-01="yes" data-Value-02="yes" data-Value-03="yes" data-Value-04="yes">Product 01</a>
<a href="#" data-Value-01="yes">Product 02</a>
<a href="#" data-Value-01="yes" data-Value-02="yes">Product 03</a>

所以我必须让我的foreach为每个产品写一行(对于每个具有不同属性和值的产品,表中有/将会有多个产品记录)但是在行中我应该将属性写为HTML数据属性

我甚至无法想出它的逻辑。

关于它的逻辑的任何想法?

由于

2 个答案:

答案 0 :(得分:0)

您提供的示例输出有点令人困惑。也许你可以准确地解释你想要放在<a></a>元素中的内容并解释使用列名。

从你的例子:

<a href="#" data-Value-01="yes" data-Value-02="yes" data-Value-03="yes" data-Value-04="yes">Product 01</a> 

这很有道理。因此,您基本上希望以ProductPropertyTwo

的形式将每个唯一<a>值作为属性附加到data-"ProductPropertyTwo"元素

但接下来的两行似乎并没有遵循确切的模式,你有:

<a href="#" data-Value-01="yes">Product 02</a>
<a href="#" data-Value-01="yes" data-Value-02="yes">Product 03</a>

这两行没有data-Value-03="yes", data-Value-04="yes", etc.

您必须使用嵌套for循环,然后在循环结束时编写<a></a>。 (但我发现你有按产品ID排序的数据,所以你可以在单循环中优化过程)

但是,请澄清输出示例。

根据您的澄清,最简单的解决方案我可以在5分钟内完成。这是&#34;伪代码&#34;或者不是伪代码:):

// Reason of using HashSet is so that we have only unique "ProductPropertyTwo" values for each product
Dictionary<String, HashSet<String>> myDictionary = new Dictionary<String, HashSet<String>>();
foreach(MyData.Product Product in my_ProductList)
{
    // if we are putting the new product, then create empty HashSet and then add the ProductPropertyTwo value
    if(myDictionary[Product.Name] == null){
        myDictionary.add(Product.Name, new HashSet<String>());
        myDictionary[Product.Name].add(Product.ProductPropertyTwo);
    }else{ // if product is already in Dictionary just add the "ProductPropertyTwo" value to the HashSet
        myDictionary[Product.Name].add(Product.ProductPropertyTwo);
    }
}

从这里你可以再次遍历字典并检查你的其他表,然后你可以将属性追加到<a></a>元素

答案 1 :(得分:0)

根据您提供的所需最终输出,您需要做的是

  • 首先,按属性名称进行过滤(您已经这样做了。)

  • 然后,按产品名称分组。

  • 对于每个组,请格式化ProductPropertyTwo值以提供所需的输出。

  • 最后,加入每个组的格式化输出。

代码段:

public class Product
{
    public int ProductId { get; set; }
    public string  ProductName { get; set; }
    public string ProductPropertyOne { get; set; }
    public string ProductPropertyTwo { get; set; }
    public int ProductSortOrder { get; set; }
}

var grouped = products.Where(p=> p.ProductPropertyOne=="Property-A").GroupBy(p => p.ProductName).Select(grp => string.Format("<a href=\"#\" {0} > {1} </a>",
    string.Join(" ", grp.Select(v => string.Format("data-{0}=\"yes\" ",v.ProductPropertyTwo))),grp.Key)).ToList();

var finalOutput= string.Join(Environment.NewLine, grouped);