【问题标题】:How to sort a Datatable's primary keys array如何对数据表的主键数组进行排序
【发布时间】:2019-02-09 04:22:35
【问题描述】:

我正在尝试对数据表中的主键数组进行排序。我找不到任何与我正在尝试做的事情相匹配的示例。

我需要比较两个数据列数组。这需要排序(至少使用我能设计的唯一方法)。

我将在这里发布我的问题的答案:How to find the differences between two datatables

我正在尝试制定一个有效的解决方案。我可以将名称复制到单独的数组中,对它们进行排序和比较,但是这种方法很难维护代码。如果这是唯一的方法,那么我会这样做,但这些方法名称暗示我有更好的方法。

数据表已填充,PrimaryKey 数组已正确填充。但是我无法让这些方法起作用:

    DTS.PrimaryKey.ToList().Sort(Function(x, y) x.Caption.CompareTo(y.Caption))
    DTT.PrimaryKey.ToList().Sort(Function(x, y) x.Caption.CompareTo(y.Caption))

或者这些:

    DTS.PrimaryKey.OrderBy(Function(c) c.Caption)
    DTT.PrimaryKey.OrderBy(Function(c) c.Caption)

在我得到相同结果之前和之后:

?DTS.PrimaryKey(0).Caption
"Manufacturer"
?DTS.PrimaryKey(1).Caption
"Make"
?DTT.PrimaryKey(0).Caption
"Manufacturer"
?DTT.PrimaryKey(1).Caption
"Style"

DTS 和 DTT 都定义为 System.Data.DataTable。 我创建了几个简单的表进行测试:

CREATE TABLE [dbo].[AAA](
    [Manufacturer] [nchar](10) NOT NULL,
    [Make] [nchar](10) NOT NULL,
    [Color] [nchar](10) NULL,
 CONSTRAINT [PK_AAA] PRIMARY KEY CLUSTERED 
(
    [Manufacturer] ASC,
    [Make] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,     ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

CREATE TABLE [dbo].[AAA](
    [Manufacturer] [nchar](10) NOT NULL,
    [Style] [nchar](10) NOT NULL,
    [Color] [nchar](10) NULL,
 CONSTRAINT [PK_AAA] PRIMARY KEY CLUSTERED 
(
    [Manufacturer] ASC,
    [Style] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

我不在乎它们的顺序是什么(升序或降序),只要它是某种顺序:

?DTS.PrimaryKey(0).Caption
"Make"
?DTS.PrimaryKey(1).Caption
"Manufacturer"
?DTT.PrimaryKey(0).Caption
"Manufacturer"
?DTT.PrimaryKey(1).Caption
"Style"

?DTS.PrimaryKey(0).Caption
"Manufacturer"
?DTS.PrimaryKey(1).Caption
"Make"
?DTT.PrimaryKey(0).Caption
"Style"
?DTT.PrimaryKey(1).Caption
"Manufacturer"

编辑:

我使用此代码进行了排序:

    Dim s = DTS.PrimaryKey.OrderBy(Function(c) c.Caption)
    Dim t = DTT.PrimaryKey.OrderBy(Function(c) c.Caption)

但我不喜欢编写让跟随我的程序员猜测的代码。我更愿意明确定义这些变量。当我检查我得到的类型时:

"System.Linq.OrderedEnumerable`2[System.Data.DataColumn,System.String]"

这看起来有点奇怪。另外,我似乎无法明确定义该类型的变量。这似乎与强类型变量背道而驰。

【问题讨论】:

    标签: vb.net


    【解决方案1】:
        Dim s As IOrderedEnumerable(Of DataColumn) = dt.PrimaryKey.OrderBy(Function(c) c.Caption)
    

    这是强类型的,没有显式声明,因为编译器知道数据类型。

    【讨论】:

    • 完美!!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    • 2021-11-08
    相关资源
    最近更新 更多