使用Tuple创建表结构

时间:2014-12-10 15:29:28

标签: c# asp.net tuples

我有一个以下列格式创建的元组列表

List<Tuple<String, String, String>> ExtendedSpecsList = new List<Tuple<String, String, String>>();

这些元组的输入将是

{Audio, Type,   Speakers - stereo - internal    }
{Audio, Output Power / Channel, 2 Watt  }
{General,   Display Type,   LCD monitor / TFT active matrix }
{General,   Diagonal Size,  23.6"   }

基于此,我试图为元组的每个顶级类别/ Item1创建以下HTML结构。我能做到这一点吗?或者我应该使用除元组之外的其他一些过程来执行此操作...

<div class="ccs-ds-extendedSpec-group">
    <div class="ccs-ds-extendedSpec-header">Audio</div>
    <div class="ccs-ds-extendedSpec-body">
        <table>
            <tbody>
                <tr>
                    <td class="ccs-ds-extendedSpec-item">Type</td>
                    <td class="ccs-ds-extendedSpec-value">Speakers - stereo - internal</td>
                </tr>
                <tr>
                    <td class="ccs-ds-extendedSpec-item" >Output Power/Channel</td>
                    <td class="ccs-ds-extendedSpec-value" >2 Watt</td>
                </tr>
            </tbody>
        </table>
    </div>
</div>

2 个答案:

答案 0 :(得分:2)

所以第一个问题是让您的数据结构与您想要显示它的方式相匹配。您希望将数据分组在第一个值上,因此您需要在绑定数据之前执行此操作:

var query = yourOriginalData.GroupBy(item => item.Item1)
    .Select(group => new { Category = group.Key, Items = group });

只有改变它就可以被绑定到可以渲染它的东西了。

要呈现它,Repeater将是正确的选择。在这里,由于您的主要集合中有子集合,因此您需要嵌套的中继器:

<asp:Repeater runat="server" ID="repeater">
    <ItemTemplate>
        <div class="ccs-ds-extendedSpec-group">
            <div class="ccs-ds-extendedSpec-header"><%# Eval("Category") %></div>
            <div class="ccs-ds-extendedSpec-body">
                <table>
                    <tbody>
                        <asp:Repeater runat="server" DataSource='<%# Eval("Items") %>'>
                            <ItemTemplate>
                                <tr>
                                    <td class="ccs-ds-extendedSpec-item">
                                        <%# Eval("Item2") %>
                                    </td>
                                    <td class="ccs-ds-extendedSpec-value">
                                        <%# Eval("Item3") %>
                                        </td>
                                </tr>
                            </ItemTemplate>
                        </asp:Repeater>
                    </tbody>
                </table>
            </div>
        </div>
    </ItemTemplate>
</asp:Repeater>

有了它你只需要将你的查询绑定到这个转发器,你就是金色的。

同样值得注意的是,虽然Tuple肯定在这里工作,但通过使用具有有意义属性名称的类,代码的可读性将得到显着提高。

答案 1 :(得分:0)

您可以使用Linq按第一个组件过滤ExtendedSpecsList,如下所示。

var Audio = ExtendedSpecList.Where(iItem => iItem.First == "Audio");
var General = ExtendedSpecList.Where(iItem => iItem.First == "General");

之后可以单独处理不同的类别。如果事先不知道不同的类别,则可以按如下方式对列表进行分组。

foreach(var Group in ExtendedSpecList.GroupBy(iItem => iItem.First))
{
    // do some processing of the group
    foreach (var iItem in Group)
    {
        // do something with an individual item
    }
}