LINQ基于2列排序数据表



我正试图对基于2列的LINQ数据表进行排序。我想按

排序
  1. 日期列第一
  2. 分类栏第二列,并在这一列中自定义排序:这里我有&;altele&;; ingrasaminte&;;;杀虫剂&;;;seminte&;;; motorina&;。我想要的顺序是"英格拉森","马达","杀虫剂","半成品"。和";Altele"最后。

这是我目前看到的:(From x In dataTable.AsEnumerable() Order By Convert.ToString(x("Date")), Convert.ToString(x("Category")) Select x).CopyToDataTable

这就把">

DataTable例子

Date             Category      TURN INTO =>    Date             Category
21.05.2022       Altele                        21.05.2022       Ingrasaminte
22.05.2022       Altele                        21.05.2022       Motorina
21.05.2022       Pesticide                     21.05.2022       Pesticide
22.05.2022       Pesticide                     21.05.2022       Seminte
21.05.2022       Ingrasaminte                  21.05.2022       Altele
22.05.2022       Ingrasaminte                  22.05.2022       Ingrasaminte
21.05.2022       Motorina                      22.05.2022       Motorina
22.05.2022       Motorina                      22.05.2022       Pesticide
21.05.2022       Seminte                       22.05.2022       Seminte
22.05.2022       Seminte                       22.05.2022       Altele

你能帮个忙吗?

首先您必须创建一个自定义的Comparer

class Comparer : IComparer<string>
{
public static Comparer Instance = new Comparer();
public int Compare(string x, string y)
{
if (x == "Altele" && y != "Altele")
{
return 1;
}
if (x != "Altele" && y == "Altele")
{
return -1;
}
return string.Compare(x, y);
}
}

然后对数据表应用以下Linq查询

OrderBy(r => r.Date).ThenBy(r => r.Category, Comparer.Instance)

下面的测试代码来自我的控制台项目。我在数据集设计器中创建了DataSet1类,DataTable1类具有DateCategory列。

using System;
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApp2
{
class Program
{
class Comparer : IComparer<string>
{
public static readonly Comparer Instance = new Comparer();
public int Compare(string x, string y)
{
if (x == "Altele" && y != "Altele")
{
return 1;
}
if (x != "Altele" && y == "Altele")
{
return -1;
}
return string.Compare(x, y);
}
}
static void Main(string[] args)
{
DataSet1 dataSet1 = new DataSet1();
var format = "dd.MM.yyyy";
var data =
@"21.05.2022       Altele
22.05.2022       Altele
21.05.2022       Pesticide
22.05.2022       Pesticide
21.05.2022       Ingrasaminte
22.05.2022       Ingrasaminte
21.05.2022       Motorina
22.05.2022       Motorina
21.05.2022       Seminte
22.05.2022       Seminte".Split(new string[] { "r", "n", "       " }, StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i < data.Length; i += 2)
{
dataSet1.DataTable1.AddDataTable1Row(DateTime.ParseExact(data[i], format, null), data[i + 1]);
}
Console.WriteLine(dataSet1.DataTable1.Select(r => $"{r.Date.ToString(format)}t{r.Category}").Aggregate((a, b) => $"{a}n{b}"));
var array = dataSet1.DataTable1.OrderBy(r => r.Date).ThenBy(r => r.Category, Comparer.Instance).ToArray();
Console.WriteLine();
Console.WriteLine(array.Select(r => $"{r.Date.ToString(format)}t{r.Category}").Aggregate((a, b) => $"{a}n{b}"));
Console.ReadKey();
}
}
}

最新更新