C# 对数据库中的数据进行排序和分类

C# 对数据库中的数据进行排序和分类,c#,sql,oracle,sorting,C#,Sql,Oracle,Sorting,我需要一种方法来分类来自数据库的大量数据(大约120个或更多值)。我没想到什么,所以我决定在这里问一下。我需要一个C#或SQL解决方案(或者至少需要一些提示) 目前需要排序的数据在一列中,但我愿意接受任何建议。数据示例如下所示: - A2-11 (Main branch that contains all A2 from below) - A2-113 - A2-114 - A2-115 - . - . - . - F-L-5 (Main branch) - F-L-55 (Another br

我需要一种方法来分类来自数据库的大量数据(大约120个或更多值)。我没想到什么,所以我决定在这里问一下。我需要一个
C#
SQL
解决方案(或者至少需要一些提示)

目前需要排序的数据在一列中,但我愿意接受任何建议。数据示例如下所示:

- A2-11 (Main branch that contains all A2 from below)
- A2-113
- A2-114
- A2-115
- .
- .
- .
- F-L-5 (Main branch)
- F-L-55 (Another branch in there)
- F-L-56 (Contains all values below)
- F-L-566 
- F-L-567
- .
- .
- .
提前谢谢

可以显示为示例,小树形图:

也许可以使用? 大卫

也许用一个? David

尝试自定义OrderBy

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


namespace ConsoleApplication50
{
    class Program
    {

        static void Main(string[] args)
        {

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


            string[] data =  { "Main-A2-11", "Main-A2-113", "Main-A2-114", "Main-A2-115",
                              "Third-F-L-56", "Third-F-L-566", "Third-F-L-567",
                              "Second-F-L-5", "Second-F-L-55"
                            };

            foreach (string d in data)
            {
                dt.Rows.Add(new object[] { d });
            }

            dt = dt.AsEnumerable().GroupBy(x => x.Field<string>("Category").Contains("-") ? 
                     x.Field<string>("Category").Substring(0,x.Field<string>("Category").IndexOf("-")) :
                     x.Field<string>("Category"))
                .Select(x => x.OrderBy(y => new SortRecord(y,"Category"))).SelectMany(x => x).CopyToDataTable();

        }
    }
    public class SortRecord : IComparer<SortRecord >, IComparable<SortRecord>
    {
        string[] rowSplitArray;
        int length = 0;
        public SortRecord(DataRow x, string name)
        {
            rowSplitArray = x.Field<string>(name).Split(new char[] { '-' });
            length = rowSplitArray.Length;
        }


        public int Compare(SortRecord  rowA, SortRecord rowB)
        {

            int len = Math.Min(rowA.length, rowB.length);

            for (int i = 0; i < len; i++)
            {
                if (rowA.rowSplitArray[i] != rowB.rowSplitArray[i])
                    return rowA.rowSplitArray[i].CompareTo(rowB.rowSplitArray[i]);
            }

            return rowA.length.CompareTo(rowB.length);

        }
        public int CompareTo(SortRecord row)
        {
            return Compare(this, row);
        }
    }

}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用系统数据;
命名空间控制台应用程序50
{
班级计划
{
静态void Main(字符串[]参数)
{
DataTable dt=新的DataTable();
添加(“类别”,类型(字符串));
字符串[]数据={“Main-A2-11”、“Main-A2-113”、“Main-A2-114”、“Main-A2-115”,
“第三F-L-56”、“第三F-L-566”、“第三F-L-567”,
“第二F-L-5”、“第二F-L-55”
};
foreach(数据中的字符串d)
{
Add(新对象[]{d});
}
dt=dt.AsEnumerable().GroupBy(x=>x.Field(“Category”)。包含(“-”)?
x、 字段(“类别”)。子字符串(0,x.Field(“类别”)。IndexOf(“-”)):
x、 字段(“类别”))
.Select(x=>x.OrderBy(y=>newsortrecord(y,“Category”))).SelectMany(x=>x.CopyToDataTable();
}
}
公共类SortRecord:IComparer,IComparable
{
字符串[]行拆分数组;
整数长度=0;
公共排序记录(数据行x,字符串名称)
{
rowSplitArray=x.Field(name).Split(新字符[]{'-});
长度=rowSplitArray.length;
}
公共整数比较(SortRecord rowA,SortRecord rowB)
{
int len=Math.Min(rowA.length,rowB.length);
对于(int i=0;i
尝试自定义OrderBy

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


namespace ConsoleApplication50
{
    class Program
    {

        static void Main(string[] args)
        {

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


            string[] data =  { "Main-A2-11", "Main-A2-113", "Main-A2-114", "Main-A2-115",
                              "Third-F-L-56", "Third-F-L-566", "Third-F-L-567",
                              "Second-F-L-5", "Second-F-L-55"
                            };

            foreach (string d in data)
            {
                dt.Rows.Add(new object[] { d });
            }

            dt = dt.AsEnumerable().GroupBy(x => x.Field<string>("Category").Contains("-") ? 
                     x.Field<string>("Category").Substring(0,x.Field<string>("Category").IndexOf("-")) :
                     x.Field<string>("Category"))
                .Select(x => x.OrderBy(y => new SortRecord(y,"Category"))).SelectMany(x => x).CopyToDataTable();

        }
    }
    public class SortRecord : IComparer<SortRecord >, IComparable<SortRecord>
    {
        string[] rowSplitArray;
        int length = 0;
        public SortRecord(DataRow x, string name)
        {
            rowSplitArray = x.Field<string>(name).Split(new char[] { '-' });
            length = rowSplitArray.Length;
        }


        public int Compare(SortRecord  rowA, SortRecord rowB)
        {

            int len = Math.Min(rowA.length, rowB.length);

            for (int i = 0; i < len; i++)
            {
                if (rowA.rowSplitArray[i] != rowB.rowSplitArray[i])
                    return rowA.rowSplitArray[i].CompareTo(rowB.rowSplitArray[i]);
            }

            return rowA.length.CompareTo(rowB.length);

        }
        public int CompareTo(SortRecord row)
        {
            return Compare(this, row);
        }
    }

}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用系统数据;
命名空间控制台应用程序50
{
班级计划
{
静态void Main(字符串[]参数)
{
DataTable dt=新的DataTable();
添加(“类别”,类型(字符串));
字符串[]数据={“Main-A2-11”、“Main-A2-113”、“Main-A2-114”、“Main-A2-115”,
“第三F-L-56”、“第三F-L-566”、“第三F-L-567”,
“第二F-L-5”、“第二F-L-55”
};
foreach(数据中的字符串d)
{
Add(新对象[]{d});
}
dt=dt.AsEnumerable().GroupBy(x=>x.Field(“Category”)。包含(“-”)?
x、 字段(“类别”)。子字符串(0,x.Field(“类别”)。IndexOf(“-”)):
x、 字段(“类别”))
.Select(x=>x.OrderBy(y=>newsortrecord(y,“Category”))).SelectMany(x=>x.CopyToDataTable();
}
}
公共类SortRecord:IComparer,IComparable
{
字符串[]行拆分数组;
整数长度=0;
公共排序记录(数据行x,字符串名称)
{
rowSplitArray=x.Field(name).Split(新字符[]{'-});
长度=rowSplitArray.length;
}
公共整数比较(SortRecord rowA,SortRecord rowB)
{
int len=Math.Min(rowA.length,rowB.length);
对于(int i=0;i
实现这一结果有多种方法,但如果您还需要决定性能,请遵循本文

您当然可以在sql中使用hierarchyid。 https://docs.microsoft.com/en-us/sql/relational-databases/hierarchical-data-sql-server


我想这可能会有所帮助。

实现这一结果有多种方法,但如果您还需要决定性能,请遵循本文

您当然可以在sql中使用hierarchyid。 https://docs.microsoft.com/en-us/sql/relational-databases/hierarchical-data-sql-server


可能有助于我的猜测。

用你正在使用的数据库标记你的问题。用你正在使用的数据库标记你的问题。我刚刚意识到它并不能完全回答我的问题。您的解决方案对数据进行了排序,但是,我还想对其进行分类。我的数据将不会有“主”、“第二”或任何其他内容,而是给定的格式:-F-L-56;-F-L-566;-F-L-567;我怎么能用你已经写的(@jdweng)和分类的方式,主要分支将持有F-L-56,其中持有F-L-566和F-L-567。可以将其可视化为菜单中的子菜单。我希望您提出此附加请求。已经有了答案。更新的代码。我刚刚意识到它不能完全回答我的问题。您的解决方案对数据进行了排序,但是,我还想对其进行分类。我的数据将不会有“主”、“第二”或任何其他内容,而是给定的格式:-F-L-56;-F-L-566;-F-L-567;我怎样才能使用你已经写的(@jdweng)并以一种主分支可以容纳F的方式进行分类呢-