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

本文关键字:条件 Net 嵌套 foreach Asp | 更新日期: 2023-09-27 17:54:28

我有一个数据表:

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数据属性。

我甚至想不出它的逻辑。

你知道它的逻辑吗?

谢谢

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

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

来自你的例子:

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

这有意义。因此,您基本上想要以data-"ProductPropertyTwo"

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

但接下来的两行似乎不遵循完全相同的模式,其中你有:

<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>。(但我看到您有按productID排序的数据,因此您将能够在单循环中优化流程)

但是,请澄清输出示例。

根据你的解释,我可以在5分钟内想出最简单的解决方案。这里是"伪代码"还是不那么伪代码:):
// 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);
    }
}

从这里您可以再次遍历dictionary并检查其他表,然后您可以将属性附加到<a></a>元素

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

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

  • 然后按ProductName分组

  • 对于每一组,格式化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);