【问题标题】:cross or one to many交叉或一对多
【发布时间】:2025-12-20 12:45:06
【问题描述】:

表:

<table border="1">
  <tr>
    <td><b>Name</b></td>
    <td><b>Selection</b></td>
  </tr>
  <tr>
    <td>Color</td>
    <td>1,2,3</td>
  </tr>
  <tr>
    <td>Shape</td>
    <td>a,b</td>
  </tr>
  <tr>
    <td>Cut</td>
    <td>x</td>
  </tr>
  <tr>
    <td>Range</td>
    <td>y</td>
  </tr>
  <tr>
    <td>Purity</td>
    <td>8,9</td>
  </tr>
</table>

我有一个键,例如:颜色 |形状 |切 |范围 |纯度

我想在选择列上循环并需要如下结果

1axy8
1axy9
1bxy8
1bxy9
2axy8
2axy9
2bxy8
2bxy9
3axy8
3axy9
3bxy8
3bxy9

如何循环选择列?

【问题讨论】:

标签: c# loops for-loop one-to-many


【解决方案1】:

您需要递归解析数据以获得您正在寻找的结果。
试试这个代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {

            DataTable dt = new DataTable();
            dt.Columns.Add("Name", typeof(string));
            dt.Columns.Add("Selection", typeof(string));

            dt.Rows.Add(new object[] { "Color", "1,2,3" });
            dt.Rows.Add(new object[] { "Shape", "a,b" });
            dt.Rows.Add(new object[] { "Cut", "x" });
            dt.Rows.Add(new object[] { "Range", "y" });
            dt.Rows.Add(new object[] { "Purity", "8,9" });

            Recursion recursion = new Recursion(dt);
            List<string> results = recursion.GetData(0);
        }
    }
    public class Recursion
    {
        public DataTable  data { get; set; }
        public Recursion(DataTable data)
        {
            this.data = data;
        }
        public List<string> GetData(int level)
        {
            if (level == data.Rows.Count - 1)
            {
                return data.Rows[level].Field<string>("Selection").Split(new char[] {','}).Select(x => x.ToString()).ToList();
            }
            else
            {

                List<string> children = GetData(level + 1);
                List<string> results = data.Rows[level].Field<string>("Selection").Split(new char[] { ',' }).Select(x => children.Select(y => x + "|" + y)).SelectMany(z => z).ToList();
                return results;
            }

        }
    }
}
​
​

【讨论】:

  • 那不是html。请运行代码片段选项。它将显示在 C# 中实际上是 Datatable 的表。
  • 以前从未见过这样发布的数据表。我更新了代码以使用 DataTable。
  • 谢谢你。正如我想要的那样:
  • 非常感谢jdweng。抱歉问题错误。因为我想要这样的结果:1|a|x|y|8。因为我的关键是颜色 |形状 |切 |范围 |纯度。这不是首先修复颜色。有时颜色可能介于两者之间。
  • 我认为用户 x + "|" 更容易+ 是的。顺序将始终是输入表中列的顺序