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数据属性。
我甚至想不出它的逻辑。
你知道它的逻辑吗?
谢谢
您提供的示例输出有点令人困惑。也许您可以准确地解释您想要在<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);