C# 从表中获取所有结果选项

C# 从表中获取所有结果选项,c#,sql,sql-server,algorithm,C#,Sql,Sql Server,Algorithm,我有下表: key | val ---------- aaa | 1 aaa | 2 aaa | 3 bbb | x bbb | y bbb | z ccc | on ccc | off 我需要写一个包含所有键选项及其值的列表 也就是说,输出应该是: aaa | 1 | bbb | x | ccc | on aaa | 1 | bbb | x | ccc | off aaa | 1 | bbb | y | ccc | on aaa | 1 | bbb | y | ccc | off aaa |

我有下表:

key | val
----------
aaa | 1
aaa | 2
aaa | 3
bbb | x
bbb | y
bbb | z
ccc | on
ccc | off
我需要写一个包含所有键选项及其值的列表

也就是说,输出应该是:

aaa | 1 | bbb | x | ccc | on
aaa | 1 | bbb | x | ccc | off
aaa | 1 | bbb | y | ccc | on
aaa | 1 | bbb | y | ccc | off
aaa | 1 | bbb | z | ccc | on
aaa | 1 | bbb | z | ccc | off
aaa | 2 | bbb | x | ccc | on
aaa | 2 | bbb | x | ccc | off
aaa | 2 | bbb | y | ccc | on
aaa | 2 | bbb | y | ccc | off
aaa | 2 | bbb | z | ccc | on
aaa | 2 | bbb | z | ccc | off
aaa | 3 | bbb | x | ccc | on
aaa | 3 | bbb | x | ccc | off
aaa | 3 | bbb | y | ccc | on
aaa | 3 | bbb | y | ccc | off
aaa | 3 | bbb | z | ccc | on
aaa | 3 | bbb | z | ccc | off
但我不知道每次都会改变的键和值

有人能帮我想出一个好的算法吗?

如果你知道这些键(如你的示例中所示),那么你可以直接进行显式的
交叉连接:

select a.*, b.*, c.*
from (select t.* from t where key = 'a') a cross join
     (select t.* from t where key = 'b') b cross join
     (select t.* from t where key = 'c') c;
如果不知道所有键,则需要使用动态SQL生成查询。

如果知道键(如示例中所示),则只需显式的
交叉联接即可:

select a.*, b.*, c.*
from (select t.* from t where key = 'a') a cross join
     (select t.* from t where key = 'b') b cross join
     (select t.* from t where key = 'c') c;

如果不知道所有键,则需要使用动态SQL生成查询。

使用递归算法:

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

namespace ConsoleApplication34
{
    class Program
    {

        static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("key", typeof(string));
            dt.Columns.Add("val", typeof(string));

            dt.Rows.Add(new object[] {"aaa","1"});
            dt.Rows.Add(new object[] {"aaa","2"});
            dt.Rows.Add(new object[] {"aaa","3"});
            dt.Rows.Add(new object[] {"bbb","x"});
            dt.Rows.Add(new object[] {"bbb","y"});
            dt.Rows.Add(new object[] {"bbb","z"});
            dt.Rows.Add(new object[] {"ccc","on"});
            dt.Rows.Add(new object[] {"ccc","off"});

            Data.data = dt.AsEnumerable()
                .GroupBy(x => x.Field<string>("key"))
                .Select(x => new Data()
                {
                    key = x.Key,
                    values = x.Select(y => y.Field<string>("val")).ToList()
                }).ToList();

            Data.Print(0, new List<string>());
            Console.ReadLine();
        }
    }
    public class Data
    {
        public static List<Data> data = null;
        public string key { get; set; }
        public List<string> values { get; set; }

        public static void Print(int level, List<string> output)
        {
            if (level == data.Count)
            {
                Console.WriteLine(string.Join(" | ", output));
            }
            else
            {
                foreach(string _value in data[level].values)
                {
                    List<string> newOutput = new List<string>();
                    newOutput.AddRange(output);
                    newOutput.Add(data[level].key);
                    newOutput.Add(_value);
                    Print(level + 1, newOutput);
                }
            }
        }
    }

}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用系统数据;
命名空间控制台应用程序34
{
班级计划
{
静态void Main(字符串[]参数)
{
DataTable dt=新的DataTable();
添加(“键”,类型(字符串));
添加(“val”,typeof(string));
Add(新对象[]{“aaa”,“1”});
Add(新对象[]{“aaa”,“2”});
Add(新对象[]{“aaa”,“3”});
Add(新对象[]{“bbb”,“x”});
Add(新对象[]{“bbb”,“y”});
Add(新对象[]{“bbb”,“z”});
Add(新对象[]{“ccc”,“on”});
Add(新对象[]{“ccc”,“off”});
Data.Data=dt.AsEnumerable()
.GroupBy(x=>x.Field(“键”))
.选择(x=>新数据()
{
key=x.key,
values=x.Select(y=>y.Field(“val”)).ToList()
}).ToList();
Data.Print(0,新列表());
Console.ReadLine();
}
}
公共类数据
{
公共静态列表数据=null;
公共字符串密钥{get;set;}
公共列表值{get;set;}
公共静态无效打印(整数级,列表输出)
{
如果(级别==数据计数)
{
Console.WriteLine(string.Join(“|”,output));
}
其他的
{
foreach(字符串_数据[level]中的值)。值)
{
List newOutput=newlist();
newOutput.AddRange(输出);
newOutput.Add(数据[level].key);
newOutput.Add(_值);
打印(级别+1,新输出);
}
}
}
}
}

使用递归算法:

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

namespace ConsoleApplication34
{
    class Program
    {

        static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("key", typeof(string));
            dt.Columns.Add("val", typeof(string));

            dt.Rows.Add(new object[] {"aaa","1"});
            dt.Rows.Add(new object[] {"aaa","2"});
            dt.Rows.Add(new object[] {"aaa","3"});
            dt.Rows.Add(new object[] {"bbb","x"});
            dt.Rows.Add(new object[] {"bbb","y"});
            dt.Rows.Add(new object[] {"bbb","z"});
            dt.Rows.Add(new object[] {"ccc","on"});
            dt.Rows.Add(new object[] {"ccc","off"});

            Data.data = dt.AsEnumerable()
                .GroupBy(x => x.Field<string>("key"))
                .Select(x => new Data()
                {
                    key = x.Key,
                    values = x.Select(y => y.Field<string>("val")).ToList()
                }).ToList();

            Data.Print(0, new List<string>());
            Console.ReadLine();
        }
    }
    public class Data
    {
        public static List<Data> data = null;
        public string key { get; set; }
        public List<string> values { get; set; }

        public static void Print(int level, List<string> output)
        {
            if (level == data.Count)
            {
                Console.WriteLine(string.Join(" | ", output));
            }
            else
            {
                foreach(string _value in data[level].values)
                {
                    List<string> newOutput = new List<string>();
                    newOutput.AddRange(output);
                    newOutput.Add(data[level].key);
                    newOutput.Add(_value);
                    Print(level + 1, newOutput);
                }
            }
        }
    }

}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用系统数据;
命名空间控制台应用程序34
{
班级计划
{
静态void Main(字符串[]参数)
{
DataTable dt=新的DataTable();
添加(“键”,类型(字符串));
添加(“val”,typeof(string));
Add(新对象[]{“aaa”,“1”});
Add(新对象[]{“aaa”,“2”});
Add(新对象[]{“aaa”,“3”});
Add(新对象[]{“bbb”,“x”});
Add(新对象[]{“bbb”,“y”});
Add(新对象[]{“bbb”,“z”});
Add(新对象[]{“ccc”,“on”});
Add(新对象[]{“ccc”,“off”});
Data.Data=dt.AsEnumerable()
.GroupBy(x=>x.Field(“键”))
.选择(x=>新数据()
{
key=x.key,
values=x.Select(y=>y.Field(“val”)).ToList()
}).ToList();
Data.Print(0,新列表());
Console.ReadLine();
}
}
公共类数据
{
公共静态列表数据=null;
公共字符串密钥{get;set;}
公共列表值{get;set;}
公共静态无效打印(整数级,列表输出)
{
如果(级别==数据计数)
{
Console.WriteLine(string.Join(“|”,output));
}
其他的
{
foreach(字符串_数据[level]中的值)。值)
{
List newOutput=newlist();
newOutput.AddRange(输出);
newOutput.Add(data[level].key);
newOutput.Add(_值);
打印(级别+1,新输出);
}
}
}
}
}

请用您正在使用的数据库标记您的问题。sql server。但是我不在乎答案是否是c#javascript sql server或oracle或任何语言。请用您正在使用的数据库标记您的问题。sql server。但是我不在乎答案是用c#javascript、sql server、oracle还是其他语言我不知道这些键和值,它们随时都可能改变。。。谢谢你:)我不知道钥匙和值,这可以改变每一次。。。不管怎样,谢谢:)代码在测试时给出了准确的预期结果。代码在测试时给出了准确的预期结果。